Авторский шаблон, виджеты фильтров боковой панели по автору?

Я хотел бы иметь возможность фильтровать мои боковые виджеты (облако тегов, категорию, архив), чтобы показывать только те теги / категории / месяцы, которые применяются к данному автору в шаблоне автора.

Каков правильный способ фильтрации или изменения этих виджетов? Я нашел эту страницу в кодексе, но не кажется, что собственные функции для любого из виджетов могут принимать идентификатор автора в качестве параметра.

Solutions Collecting From Web of "Авторский шаблон, виджеты фильтров боковой панели по автору?"

Немного неудобно просто хватать все сообщения автора и фильтровать их, чтобы возвращать список категорий. Если вы хотите использовать виджеты по умолчанию на боковой панели и отфильтровать их автором только по шаблону автора, я бы предложил использовать следующий подход.

Сначала отфильтруйте запросы виджета тегов и категорий для категорий и тегов.

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; } 

Затем используя зависимый метод для извлечения идентификаторов таксономии, отфильтрованных по идентификатору пользователя.

 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

Нет никакого встроенного способа сделать это, и я не знаю, что это было проверено ранее. Сказанное, инструменты все там, вы должны собрать их вместе.

Вы можете получить текущий идентификатор пользователя с помощью $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()

Я не тестировал это, но вы можете попробовать

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