comment créer la logique qui rend ces messages triables soit par la première lettre du titre, soit par des numéros?
Je veux que quand je clique sur une "lettre", les messages doivent être mis à jour avec la première lettre que je veux quand je clique sur une "lettre", les messages doivent être mis à jour avec la première lettre donnée
Si vous souhaitez vérifier la page d'origine: https://neverquit.000webhostapp.com/library
Je pense qu’il existe une meilleure approche: il suffit de créer une taxonomie personnalisée contenant les termes alphanumériques, puis d’affecter chaque message au terme correct.
Vous pouvez utiliser l'action save post pour affecter automatiquement des publications à la correction du terme après l'enregistrement:
function save_index( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
$slug = 'post';
$letter = '';
// only run for posts
if ( isset( $_POST['post_type'] ) && ( $slug != $_POST['post_type'] ) ) {
return;
}
// Check user capabilities
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
$taxonomy = 'index'; // our custom taxonomy
if ( isset( $_POST['post_type'] ) ) {
// Get the title of the post
$title = strtolower( $_POST['post_title'] );
// The next few lines remove A, An, or The from the start of the title
$splitTitle = explode( ' ', $title );
$blacklist = [ 'an ', 'a ', 'the ' ];
$splitTitle[0] = str_replace( $blacklist, '', strtolower( $splitTitle[0] ) );
$title = implode( ' ', $splitTitle );
// Get the first letter of the title
$letter = substr( $title, 0, 1 );
// Set to 0-9 if it's a number
if ( is_numeric( $letter ) ) {
$letter = '0-9';
}
// set term as first letter of post title, lower case
wp_set_post_terms( $post_id, $letter, $taxonomy );
}
}
add_action( 'save_post', 'save_index' );
C'est un peu court et pas beaucoup de détail. J'ai l'intention d'y revenir plus en détail à un moment donné.
Cependant, à court terme, cette solution devrait répondre exactement à vos besoins. Vous devrez évidemment développer cela, mais ce sont les bases.
Cet exemple suppose que le type de publication est mbe-members
et que le slug de réécriture du type de publication est /member/
.
add_action( 'init', function () {
add_rewrite_tag( '%member-filter%', 'members/filter/([a-zA-Z0-9-]{1,3})', 'post_type=mbe-members&filter=' );
add_permastruct( 'member-filter', '%member-filter%', array( 'with_front' => false ) );
} );
Vous devez vous assurer que cela est effectué avant l'enregistrement de votre type de message.
Vous devrez également vous assurer de vider vos règles de réécriture.
Remarque: Pour des raisons de simplicité extrême, le reste des tâches sera effectué dans votre fichier de modèle de thème Post Type Archive. (Je vais améliorer cette partie dans le futur)
$filter = get_query_var( 'filter' );
$filter_start = null;
$filter_end = null;
if ( strpos( $filter, '-' ) !== false ) {
if ( $pieces = explode( '-', $filter ) ) {
if ( isset( $pieces[0] ) ) {
$filter_start = $pieces[0];
}
if ( isset( $pieces[1] ) ) {
$filter_end = $pieces[1];
}
}
} else {
$filter_start = substr( $filter, 0, 1 );
}
Ce filtrage permet également une gamme de lettres ou de chiffres.
A/K/A - Vous pouvez spécifier: /members/filter/a
ou /members/filter/a-z/
global $wpdb;
$post_ids = array();
if ( ! is_null( $filter_start ) && ! is_null( $filter_end ) ) {
$range = range( $filter_start, $filter_end );
foreach ( $range as $value ) {
$query_args = array(
'SELECT' => 'ID',
'FROM' => $wpdb->posts,
'WHERE' => 'post_title'
);
if ( $query = $wpdb->get_results( $wpdb->prepare( "
SELECT {$query_args['SELECT']}
FROM {$query_args['FROM']}
WHERE {$query_args['WHERE']}
LIKE %s
AND post_type = %s
", "{$value}%", 'mbe-members' ) ) ) {
foreach ( $query as $result ) {
if ( ! in_array( $result->ID, $post_ids ) ) {
$post_ids[] = $result->ID;
}
}
}
}
} else {
if ( ! is_null( $filter_start ) ) {
$value = $filter_start;
$query_args = array(
'SELECT' => 'ID',
'FROM' => $wpdb->posts,
'WHERE' => 'post_title',
);
if ( is_numeric( $value ) ) {
$query_args['LIKE'] = '%d';
} else {
$query_args['LIKE'] = '%s';
}
if ( $query = $wpdb->get_results( $wpdb->prepare( "
SELECT {$query_args['SELECT']}
FROM {$query_args['FROM']}
WHERE {$query_args['WHERE']}
LIKE {$query_args['LIKE']}
AND post_type = %s
", "{$value}%", "mbe-members" ) ) ) {
foreach ( $query as $result ) {
if ( ! in_array( $result->ID, $post_ids ) ) {
$post_ids[] = $result->ID;
}
}
}
}
}
$content = '';
if ( ! empty( $post_ids ) ) {
$query = new \WP_Query( array(
'post_type' => 'mbe-members',
'posts_per_page' => absint( get_option( 'posts_per_page' ) ),
'post_status' => 'publish',
'orderby' => 'post_title',
'order' => 'ASC',
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
'suppress_filters' => true,
'post__in' => $post_ids
) );
if ( $query->have_posts() ) {
foreach ( $query->posts as $post ) {
$content .= $post->post_title . '<br />';
}
}
}
echo '<div>' . PHP_EOL;
echo '<ul class="nav nav-tabs" role="tablist">' . PHP_EOL;
$class = '';
if ( $filter == '0-9' ) {
$class = 'active';
}
echo '<li role="presentation" class="' . $class . '"><a href="' . site_url( '/member/filter/0-9/' ) . '" aria-controls="0-9" role="tab">0-9</a></li>' . PHP_EOL;
foreach ( range( 'a', 'z' ) as $letter ) {
$class = '';
if ( $letter == $filter_start ) {
$class = 'active';
}
echo '<li role="presentation" class="' . $class . '"><a href="' . site_url( '/member/filter/' . $letter . '/' ) . '" aria-controls="' . $letter . '" role="tab">' . $letter . '</a></li>' . PHP_EOL;
}
echo '</ul>' . PHP_EOL;
echo '<div class="tab-content">' . PHP_EOL;
$class = '';
if ( $filter == '0-9' ) {
$class = 'active';
}
echo '<div role="tabpanel" class="tab-pane ' . $class . '" id="0-9">' . PHP_EOL;
if ( $filter == '0-9' ) {
echo $content;
}
echo '</div>' . PHP_EOL;
foreach ( range( 'a', 'z' ) as $letter ) {
$class = '';
if ( $letter == $filter_start ) {
$class = 'active';
}
echo '<div role="tabpanel" class="tab-pane ' . $class . '" id="' . $letter . '">' . PHP_EOL;
if ( $letter == $filter_start ) {
echo $content;
}
echo '</div>' . PHP_EOL;
}
echo '</div>' . PHP_EOL;
echo '</div>' . PHP_EOL;
Comme je l'ai dit, c'était une réponse très rapide. Ce qui effectivement répond à votre question. C'est très dur et simple, mais il fait ce dont vous avez besoin. Je vais essayer d'améliorer cette réponse pour qu'elle soit un peu plus élégante.