web-dev-qa-db-fra.com

Comment regrouper les messages par la première lettre ou le premier numéro?

 Can You plz guide me  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

3
Ashley

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' );
5
Alex Sancho

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/.

Étape 1) Ajouter la règle de réécriture personnalisée et la variable de requête

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)

Étape 2) Déterminer ce qui doit être filtré

$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/

Étape 3) ID de post de requête pour les correspondances filtrées

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;
                }

            }

        }

    }

}

Étape 4) Interrogez les objets de publication et affichez l'affichage

$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;

Conclusion

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.

1
Michael Ecklund