Фильтрация сообщений по нескольким терминам таксономии, например, в списке сообщений администратора?
После прочтения Добавление фильтра таксономии в Список администраторов для пользовательского типа записи? Я попробовал, но мне не удалось заставить его фильтровать две (2) разные таксономии одновременно. Система фильтрует только последнюю таксономию и игнорирует другую.
Кто-нибудь знает, как фильтровать две таксономии одновременно?
2 answers
У меня сейчас нет времени на то, чтобы написать для вас полностью рабочий пример, но, поскольку вы запросили помощь по электронной почте, я решил, что укажу вам правильное направление.
Как вы можете знать, а можете и не знать, на самом деле это не проблема для списка сообщений администратора; почти весь этот код должен работать нормально. Проблема в том, что в настоящее время WordPress не имеет возможности использовать query_posts()
/get_posts()
/WP_Query
для фильтрации по нескольким терминам таксономии без использования крючков. (Существует очень хороший шанс, что это изменится в версии 3.1; мы можем только надеяться!)
Решение состоит в том, чтобы использовать крючок 'posts_where'
, как показано здесь, с функцией tax_terms_where()
, написанной для этого ответа:
Вам также потребуется изменить крючок 'parse_query'
для захвата значений фильтра, что-то вроде этого (Я не проверял это, поэтому может быть небольшой синтаксис ошибки):
<?php
add_filter('parse_query','yoursite_parse_query');
function yoursite_parse_query($query) {
global $pagenow;
$qv = &$query->query_vars;
if ($pagenow=='edit.php') {
$tax_terms = array();
if (!empty($qv['marka']))
$tax_terms[] = "marka:{$qv['marka']}";
if (!empty($qv['konu']))
$tax_terms[] = "konu:{$qv['konu']}";
if (count($tax_terms))
$qv['tax_terms'] = implode(',',$tax_terms);
}
}
Вышесказанное предполагает, что у вас есть выпадающие списки с именами 'marka'
и 'konu'
. Вероятно, вам также потребуется сообщить WordPress, чтобы он распознал их как переменные запроса с помощью крючка 'admin_init'
. Опять же, я не проверял это, поэтому я надеюсь, что это работает так, как написано:
add_action('init','yoursite_init');
function yoursite_init() {
global $wp;
$wp->add_query_var('marka');
$wp->add_query_var('konu');
}
Вот и все. Объедините знания трех постов; этот, тот, что в списках администраторов, и тот, что в нескольких запросах таксономии, и я думаю, вы это сделаете. Вы могли бы даже хотите опубликовать свое решение, чтобы другие могли у вас поучиться. Дай мне знать, если застрянешь.
Поздний ответ
Обновление для WordPress 3.5+
Я написал следующий плагин для расширения WP_List_Table
для встроенных и пользовательских типов сообщений со следующими функциями:
- Добавить столбец (если
show_admin_column
имеет значениеfalse
) - Добавьте таксоны вкл. ссылки на ячейку таблицы
- Добавьте раскрывающийся список, показывающий количество записей, назначенных таксону, для фильтрации отображаемых записей
- Позволяет фильтровать более чем по одному таксономия
Вот плагин (лучше всего использовать как mu-плагин):
add_action( 'plugins_loaded', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
class WCM_Admin_PT_List_Tax_Filter
{
private static $instance;
public $post_type;
public $taxonomies;
public $new_cols = array();
static function init()
{
null === self :: $instance AND self :: $instance = new self;
return self :: $instance;
}
public function __construct()
{
add_action( 'load-edit.php', array( $this, 'setup' ) );
}
public function setup()
{
add_action( current_filter(), array( $this, 'setup_vars' ), 20 );
add_action( 'restrict_manage_posts', array( $this, 'get_select' ) );
add_filter( "manage_taxonomies_for_{$this->post_type}_columns", array( $this, 'add_columns' ) );
}
public function setup_vars()
{
$this->post_type = get_current_screen()->post_type;
$this->taxonomies = array_diff(
get_object_taxonomies( $this->post_type )
,get_taxonomies( array( 'show_admin_column' => 'false' ) )
);
}
public function add_columns( $taxonomies )
{
return array_merge(
$taxonomies
,$this->taxonomies
);
}
/**
* Select form element to filter the post list
* @return string HTML
*/
public function get_select()
{
$html = '';
foreach ( $this->taxonomies as $tax )
{
$options = sprintf(
'<option value="">%s %s</option>'
,__( 'View All' )
,get_taxonomy( $tax )->label
);
$class = is_taxonomy_hierarchical( $tax ) ? ' class="level-0"' : '';
foreach ( get_terms( $tax ) as $taxon )
{
$options .= sprintf(
'<option %s%s value="%s">%s%s</option>'
,isset( $_GET[ $tax ] ) ? selected( $taxon->slug, $_GET[ $tax ], false ) : ''
,'0' !== $taxon->parent ? ' class="level-1"' : $class
,$taxon->slug
,'0' !== $taxon->parent ? str_repeat( ' ', 3 ) : ''
,"{$taxon->name} ({$taxon->count})"
);
}
$html .= sprintf(
'<select name="%s" id="%s" class="postform">%s</select>'
,$tax
,$tax
,$options
);
}
return print $html;
}
}
Объяснение
Сначала я проделал потрясающую, но большую работу, чтобы добавить пользовательские столбцы (не знал об обновлении 3.5 для show_admin_column
). Затем я многое сделал для parse_query
, чтобы отфильтровать его по двум таксономиям. К счастью, я мгновенно получил удивительный результат (без добавления кода). Посмотрите на следующий пример дампа:
public 'tax_query' =>
object(WP_Tax_Query)[429]
public 'queries' =>
array (size=2)
0 =>
array (size=5)
'taxonomy' => string 'post_format' (length=11)
'terms' =>
array (size=1)
0 => string 'post-format-gallery' (length=19)
'include_children' => boolean true
'field' => string 'slug' (length=4)
'operator' => string 'IN' (length=2)
1 =>
array (size=5)
'taxonomy' => string 'category' (length=8)
'terms' =>
array (size=4)
0 => int 5
1 => int 6
2 => int 7
3 => int 8
'include_children' => boolean false
'field' => string 'term_id' (length=7)
'operator' => string 'IN' (length=2)
public 'relation' => string 'AND' (length=3)
WP уже делает это по умолчанию!