web-dev-qa-db-ja.com

作者テンプレート、作者によるサイドバーウィジェットのフィルタ

自分のサイドバーウィジェット(タグクラウド、カテゴリ、アーカイブ)をフィルタして、著者テンプレートの特定の著者に適用されるタグ/カテゴリ/月だけを表示できるようにしたいです。

これらのウィジェットをフィルタリングまたは変更するための正しい方法は何ですか?私は このページ をコーデックスの中に見つけましたが、どのウィジェットのネイティブ関数も作者IDをパラメータとして受け入れることはできないようです。

6
javy

投稿者がすべての投稿を取得して、カテゴリリストのみを返すようにそれらをフィルタ処理するだけでは、少し面倒です。サイドバーでデフォルトのウィジェットを使用し、それらを作成者テンプレートのみで作成者によってフィルタリングしたい場合は、次の方法を使用することをお勧めします。

まず、カテゴリとタグに対するタグとカテゴリウィジェットのクエリをフィルタリングします。

add_filter( 'widget_tag_cloud_args', 'filter_categories_by_author' );
add_filter( 'widget_categories_dropdown_args', 'filter_categories_by_author' );
add_filter( 'widget_categories_args', 'filter_categories_by_author' );
function filter_categories_by_author( $args ){
    // only process if on the author template
    if( is_author() ){
        $author_id = get_the_author_meta( 'ID' );
        $taxonomy = !empty( $args['taxonomy'] ) ? $args['taxonomy'] : 'category';
        // filter by including only IDs associated to the author
        $args['include'] = get_taxonomy_ids_by_author( $author_id, $taxonomy );
    }
    return $args;
}

次に、従属メソッドを使用してユーザーIDでフィルター処理された分類IDを取得します。

function get_taxonomy_ids_by_author( $user_id, $taxonomy = 'category' ){
    global $wpdb;
    return $wpdb->get_col( $wpdb->prepare( "
        SELECT DISTINCT(terms.term_id) as ID
        FROM $wpdb->posts as posts
        LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
        LEFT JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
        LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
        WHERE 1=1 AND (
            posts.post_status = 'publish' AND
            posts.post_author = %d AND
            tax.taxonomy = '%s' )
        ORDER BY terms.name ASC
    ", $user_id, $taxonomy ) );
}

ソース: https://Gist.github.com/codearachnid/9655690

3
codearachnid

これを行うための方法が組み込まれていません、そしてそれが以前に試みられたことを私は知りません。とはいえ、ツールはすべてそろっているので、それらを組み合わせる必要があります。

現在のユーザーIDは $userid = wp_get_current_user() で取得できます。

$posts = WP_Query('author='.$userid) を使用すると、ユーザーによる投稿をすべて取得できます。

それから、作者によるすべての投稿をループして、各投稿のカテゴリを配列に追加します。例えば、

$allCategories = Array();
foreach($posts as $post){
    array_merge($allCategories, wp_get_post_categories($post->ID))
}

それから array_unique() 関数を使って重複を取り除きます。

最後に、各カテゴリを調べて、 get_category_link() でカテゴリへのリンクを取得します。

1
evandentremont

私はこれをテストしていませんが、試すことができます

add_action('pre_get_posts', callback);
function callback( &$query )
{
    if ( is_author() ) {
        $query->set('author', get_the_author_meta('ID') );
    }
}
0
Max