web-dev-qa-db-fra.com

Liste des pages pour afficher uniquement les sous-pages de la liste blanche

Dans mon thème personnalisé, je souhaite afficher toutes les pages parentes, mais pour certaines de ces pages parentes, je ne souhaite pas afficher leurs sous-pages.

Je sais que vous pouvez ajouter toutes ces sous-pages à l'argument 'exclude' de la fonction wp_list_pages mais je veux m'assurer que, chaque fois que quelqu'un ajoute une nouvelle sous-page, celle-ci ne s'affichera pas non plus.

Exclure une arborescence pourrait être une possibilité mais celle-ci ignore également la page parente.

Mon code:

$subtitle_walker = new Subtitle_Walker();

$args = array(
    'authors'      => '',
    'child_of'     => 0,
    'date_format'  => get_option('date_format'),
    'depth'        => 2,
    'echo'         => 1,
    'exclude'      => '',
    'exclude_tree' => '',
    'include'      => '',
    'link_after'   => '',
    'link_before'  => '',
    'post_type'    => 'page',
    'post_status'  => 'publish',
    'show_date'    => '',
    'sort_column'  => 'menu_order',
    'title_li'     => '', 
    'walker'       => new Subtitle_Walker
);

wp_list_pages($args);
1
Dragon54

La solution la plus simple pour ajouter des identifiants de page à wp_list_pages() consiste à utiliser un rappel de filtre auto-supprimant/en cours d'exécution unique dans get_pages(), qui est la fonction permettant d'extraire les données de Cache ou d'une requête récente dans la base de données.

Vous avez plusieurs options ici:

Filtrer le résultat final de la base de données

Pour filtrer la liste des pages renvoyées, vous pouvez créer vous-même un plugin rapide avec un rappel de filtre que vous pouvez utiliser dans vos modèles:

<?php
/** Plugin Name: WPSE (#165677) Whitelist pages Callback */
function wpse165677_whitelist_pages( $pages, $arguments )
{
    if ( empty( $pages ) )
        return $pages;

    // Remove instantly
    remove_filter( current_filter(), __FUNCTION__, 10 );

    // whitelist: loop through pages and build your return array of allowed pages

    return $pages;
}

Ensuite, dans votre modèle:

add_filter( 'get_pages', 'wpse165677_whitelist_pages', 10, 2 );
wp_list_pages( [
    // your arguments
] );

Cela interroge certaines pages inutiles, mais c'est une solution rapide qui ne nuit pas aux performances, sauf si vous avez des centaines de pages.

Ignorer les pages non inscrites à la liste blanche dans le MarkUp

Créez simplement un programme personnalisé qui ne construit que la sous-page MarkUp pour les pages de votre liste blanche.

Pré-chercher et exclure des pages

Vous pouvez faire une requête pour seulement l'ID

$wpdb->prepare(
    "SELECT id 
    FROM{$wpdb->posts} 
    WHERE {$wpdb->posts}.post_type = 'page' 
        AND {$wpdb->posts}.id IN (%s)",
    join( ",", [ /* IDs Array */ ] ),
);

où vous différenciez simplement cette valeur renvoyée par rapport à tous les ID retournés par page post pour créer une liste noire. Renvoyez ensuite cela à l'intérieur d'un rappel sur le wp_list_pages_excludes, utilisé pour remplir l'argument exclude. Vous pouvez utiliser wp_parse_id_list() pour faciliter la construction de la liste.

add_filter( 'wp_list_pages_excludes', function( $blacklist )
{
    // logic to build blacklist
    return $blacklist;
}

Transmettre des arguments

Ni dans le docBlock, ni dans le Codex wp_list_pages(), aucun filtre ne s'exécute sur les arguments de cette fonction avant qu'ils ne soient passés à get_pages(). Donc, l'argument include fonctionne également sur cette fonction. Gardez à l’esprit que cet argument ne peut pas être utilisé avec 'child_of', 'parent', 'exclude', 'meta_key', 'meta_value', or 'hierarchical'.

Conclusion

Comme souvent, la tâche à laquelle vous faites face peut être résolue de différentes manières. Ce que vous utilisez finalement dépend de vous et dépend de vos exigences très spécifiques .

0
kaiser