私のカスタムテーマでは、すべての親ページを表示したいのですが、いくつかの親ページではサブページを表示したくありません。
これらすべてのサブページをwp_list_pages関数の 'exclude'引数に追加できることは知っていますが、誰かが新しいサブページを追加するたびに、そのサブページも表示されないようにする必要があります。
ツリーを除外することも可能ですが、親ページも無視されます。
私のコード:
$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);
wp_list_pages()
のページIDをホワイトリストに追加する最も簡単な方法は、get_pages()
内で自己削除/シングルタイム実行フィルタコールバックを使用することです。これは、CacheまたはDBへの新しいクエリからデータを取得する関数です。
そこにいくつかの選択肢があります。
返されたページのリストをフィルタするために、テンプレートで使用できるフィルタコールバックを持つクイックプラグインを自分で構築することができます。
<?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;
}
それから、あなたのテンプレートで:
add_filter( 'get_pages', 'wpse165677_whitelist_pages', 10, 2 );
wp_list_pages( [
// your arguments
] );
これはいくつかの不必要なページを問い合わせますが、それは迅速な解決策であり、あなたが何百ものページを持っていない限り性能を落とさないかもしれません。
ホワイトリストに登録されたページのサブページMarkUpのみを構築するカスタムウォーカーを構築するだけです。
あなただけのIDのためにクエリを行うことができます
$wpdb->prepare(
"SELECT id
FROM{$wpdb->posts}
WHERE {$wpdb->posts}.post_type = 'page'
AND {$wpdb->posts}.id IN (%s)",
join( ",", [ /* IDs Array */ ] ),
);
その後、単純にその戻り値をすべてのpage
投稿タイプと比較して比較し、ブラックリストを作成するためのIDを返しました。それをexclude
引数を埋めるために使用されるwp_list_pages_excludes
のコールバック内でそれを返します。リストを簡単に作成するために、 wp_parse_id_list()
を使用できます。
add_filter( 'wp_list_pages_excludes', function( $blacklist )
{
// logic to build blacklist
return $blacklist;
}
DocBlockでもCodexでも、wp_list_pages()
は、それらがget_pages()
に渡される前に、その関数引数で実行されているフィルタがないと説明されていません。そのためinclude
引数はこの関数でも機能します。この引数は'child_of', 'parent', 'exclude', 'meta_key', 'meta_value', or 'hierarchical'.
と併用することはできますことはできませんことに留意してください
多くの場合、あなたが直面しているタスクは、さまざまな方法で解決できます。あなたが最終的に使用するものはあなた次第であり、あなたの非常に特定の要件に依存します。