特定のカテゴリがフロントエンドに表示されないようにする必要があるユースケースが最近あります。詳しくは、そのカテゴリに割り当てられている投稿をから除外する必要がありました。
next/prev_post_link()
)そしてカテゴリ名自体がの項目として表示されないようにします。
the_category()
結果として、私はすぐに私がここで共有し、さらなるフィードバックにさらしたい結果を探求していることに気付きました。
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()
がメニュー項目をしっかり把握していることは間違いありませんが。
これを読んでくれてありがとう、コメントをありがとう!