web-dev-qa-db-ja.com

ループ、クエリ、ウィジット、投稿ナビゲーションからカテゴリを主張

特定のカテゴリがフロントエンドに表示されないようにする必要があるユースケースが最近あります。詳しくは、そのカテゴリに割り当てられている投稿をから除外する必要がありました。

  • メインクエリ(“ the Loop”)
  • 検索クエリ
  • カテゴリクエリ
  • アーカイブクエリ
  • 投稿ナビゲーション(next/prev_post_link()

そしてカテゴリ名自体がの項目として表示されないようにします。

  • テーマテンプレートのthe_category()
  • カテゴリウィジェット(リストとドロップダウン)

結果として、私はすぐに私がここで共有し、さらなるフィードバックにさらしたい結果を探求していることに気付きました。

4
glueckpress

pre_get_posts()のカテゴリを除外する

私は、pre_get_posts()set_query_var()でカテゴリーを除外することは、ウィジェットを除いてうまくいくことを発見しました。 Recent Post Widgetは、代わりに$query->set()を使用している場合にのみカテゴリーを除外します。

<?php
/**
 * Does NOT apply to the Recent Posts widget. 
 */
function glck1403271109_exclude_categories( $query ) {

    $excluded = array( '1', '2' );

    if( ! is_admin() )
        set_query_var( 'category__not_in', $excluded );
}    
add_filter( 'pre_get_posts', 'glck1403271109_exclude_categories' );


/**
 * Does apply to the Recent Posts widget. 
 */
function glck1403271122_exclude_categories( $query ) {

    $excluded = array( '1', '2' );

    if( ! is_admin() )
        $query->set( 'category__not_in', $excluded );
}
add_filter( 'pre_get_posts', 'glck1403271122_exclude_categories' );

クエリとウィジェットからカテゴリを除外する

クエリやウィジェットからカテゴリを除外することで、私はミニプラグインにまとめたいくつかの機能を得ました。コードは 要旨にあります

投稿ナビゲーションからカテゴリを除外する(next/prev_post_link()

next/prev_post_link()とその基礎となるget_関数はすべてget_adjacent_post()に依存しています。これは今日(WordPress 3.9.1)ではWP-Queryを使用していませんが、独自のSQLクエリを修正しています。 Tracチケット#26937 は、get_adjacent_post()WP_Queryを使用させることを目的としていますが、そこに到着するまでしばらく時間がかかる場合があります。

私の場合、next/prev_post_link()からカテゴリを除外することは、カテゴリIDを関数に直接除外することで十分に達成できます。これはget_adjacent_post()と直接やり取りするプラグインからも起こり得ます。これが私のテンプレートタグです。前述のミニプラグインからglckprss_exclude_categories__category_names()をチェックすることは、もちろん、後者が使用されているときにのみ意味があります。

<?php
/**
 * Exclude categories from prev/next post links.
 *
 * $exclude  (array) - category slugs to retrieve IDs from
 * $excluded (array) - category IDs to be excluded
 */
$exclude  = array();
$excluded = array();

// Mini plugin active?
if( function_exists( 'glckprss_exclude_categories__category_names' ) ) {

    $exclude = glckprss_exclude_categories__category_names();

else {

    $exclude  = array(
            get_category_by_slug( 'my-category' ),
            get_category_by_slug( 'my-other-category' )
            );
}

// Retrieve IDs
foreach( $exclude as $category ) {

    if( $category )
        $excluded[] = absint( $category->term_id );
}

/* Next Post */
next_post_link( '%link', '%title', false, $excluded );

/* Previous post */
previous_post_link( '%link', '%title', false, $excluded );

メニュー

私のユースケースでは、私はカスタムメニューしか持っていなかったのでメニューからカテゴリを除外することは必要ではなかったので、私はその方向で調査していません。 pre_get_posts()がメニュー項目をしっかり把握していることは間違いありませんが。

これを読んでくれてありがとう、コメントをありがとう!

4
glueckpress