web-dev-qa-db-ja.com

ホワイトリストサブページのみを表示するようにページを一覧表示する

私のカスタムテーマでは、すべての親ページを表示したいのですが、いくつかの親ページではサブページを表示したくありません。

これらすべてのサブページを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);
1
Dragon54

wp_list_pages()のページIDをホワイトリストに追加する最も簡単な方法は、get_pages()内で自己削除/シングルタイム実行フィルタコールバックを使用することです。これは、CacheまたはDBへの新しいクエリからデータを取得する関数です。

そこにいくつかの選択肢があります。

最終的な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'.と併用することはできますことはできませんことに留意してください

結論

多くの場合、あなたが直面しているタスクは、さまざまな方法で解決できます。あなたが最終的に使用するものはあなた次第であり、あなたの非常に特定の要件に依存します。

0
kaiser