web-dev-qa-db-ja.com

カテゴリウィジェットにカスタム投稿タイプを含める

だから私は、分類法としてデフォルトのcategorypost_tagを使った1つのCPTという、かなり単純な設定を得ました。

同じカテゴリに1つの投稿と1つのCPTエントリが割り当てられているとします。これはカテゴリウィジェット内にも反映される必要があります。

ウィジェットによって生成されたリンクが機能するように、requestフィルタを介してカテゴリページに両方を表示することができました。

問題は、投稿が存在しない場合、ウィジェットはそのカテゴリへのリンクを生成しないことです(それが空であると見なします)。

また、アイテム数が正しくありません。2ではなく1です。

ウィジェットのコードを調べてみると、これが問題の原因です。

wp_list_categories(apply_filters('widget_categories_args', $cat_args));

だから私はフィルタを介して引数を変更することができますがwp_list_categories()はそれがどの投稿タイプを使うべきかについての引数を持っていません。

私は他の誰かが以前に問題に遭遇したのを見ました:

http://wordpress.org/support/topic/custom-post-types-and-category-widget - 運が悪い

http://themehybrid.com/support/topic/custom-post-types-and-category-widget - 同じ男、ジャスティンの返事を読むことができないが、私は運が悪くなるとは思わない。彼は終わりに切符を提出し、それは閉じられました

解決策についての考え

デフォルトのウィジェットコードをコピー/貼り付けして新しいものを作成しないで、どういうわけかフィルタを使用してこれを解決したいのですが。

それは言われて、カスタムウォーカーはこれを手伝うでしょうか?何か案は?

補足として、私はこれを使用してアーカイブウィジェットに関する同様の問題を解決しました:

/*
* Add CPTs to wp_get_archives()
* http://bajada.net/2010/07/15/adding-custom-post-types-to-wp_get_archives
*/
function ucc_getarchives_where_filter( $where , $r ) {
    $args = array( 'public' => true , '_builtin' => false );
    $output = 'names'; $operator = 'and';

    $post_types = get_post_types( $args , $output , $operator );
    $post_types = array_merge( $post_types , array( 'post' ) ); $post_types = "'" . implode( "' , '" , $post_types ) . "'";

    return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where );
}
add_filter( 'getarchives_where' , 'ucc_getarchives_where_filter' , 10 , 2 ); 

乾杯!

3
GreenDude

私は 'アクター' cptを持っていて、それは自動的にクエリに追加されるようです:

SELECT object_id, term_taxonomy_id
FROM wp_term_relationships INNER JOIN wp_posts ON object_id = ID 
WHERE term_taxonomy_id IN (38,40,30,11,32,34,29,39,35,9,31,19,33,37,42,41,27,25,36,1,26) 
AND post_type IN ('post', 'actor')
AND post_status = 'publish'

Call from: require, require_once, include, get_sidebar, get_template_part, locate_template, load_template, require, dynamic_sidebar, call_user_func_array, WP_Widget->display_callback, WP_Widget_Categories->widget, wp_list_categories, get_categories, get_terms, _pad_term_counts

デバッグクエリ pluginを使う)

そしてこれがCPTの定義です。

register_post_type('actor', array(
  'public' => true,
  'labels' => $labels,
  'has_archive' => 'actors',
  'taxonomies' => array( 'category' )
));
1
scribu