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);
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:
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.
Créez simplement un programme personnalisé qui ne construit que la sous-page MarkUp pour les pages de votre liste blanche.
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;
}
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'.
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 .