Есть ли простой способ запросить любые сообщения, которые помечены каким-либо термином из определенной таксономии?
Я знаю эту технику:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
Но я бы хотел передать вместо term_slug подстановочный знак, или, возможно, просто пустую строку. Тогда это даст мне все посты, которые помечены любым термином в этой таксономии, а не только одним конкретным термином.
Спасибо за вашу помощь, Дэйв
Нечто подобное может работать:
Вы в основном запрашиваете любую публикацию, назначенную любому термину в пределах your_custom_taxonomy.
источник
Привет @ Дэйв Моррис:
Вы правы, WordPress решает, если у вас нет термина, они просто проигнорируют вашу таксономию.
Есть три (3) основных подхода, которые вы можете попробовать:
Используйте полный SQL-запрос с
$wpdb->get_results()
,Получите список
$post->ID
s для всех сообщений в вашей таксономии, а затем передайте их, используя'post__id'
аргумент, илиАннотируйте SQL, используемый с
WP_Query
помощью одного из хуков, который позволяет вам добавить SQL,INNER JOIN
ссылающийся на таблицы таксономии.Я стараюсь избегать полного SQL в WordPress до тех пор, пока он либо не поможет, либо просто возвращает список идентификаторов. И в этом случае я бы не стал использовать список
$post-ID
s для использования с'post__id'
аргументом, потому что это может привести к проблемам с производительностью и даже к памяти, если у вас много постов. Так что это оставляет нас с # 3.Я создал Расширяемый класс
WP_Query
под названием ,PostsByTaxonomy
который использует'posts_join
'крюк. Вы можете видеть это здесь:Вы бы назвали этот класс, как вы видите ниже. Аргумент
'taxonomy'
является обязательным, но вы можете передать любые (все?) Другие ожидаемые параметрыWP_Query
, такие как'posts_per_page'
:Вы можете скопировать
PostsByTaxonomy
класс вfunctions.php
файл вашей темы или использовать его в.php
файле плагина, который вы пишете.Если вы хотите быстро его протестировать, я разместил в Gist автономную версию кода, которую вы можете загрузить и скопировать в корневой каталог вашего веб-сервера как
test.php
, изменить для своего варианта использования, а затем запросить в браузере, используя URL-адрес, напримерhttp://example.com/test.php
,ОБНОВИТЬ
Чтобы опустить Sticky Posts из постов, включенных в запрос, попробуйте это:
Или, если вам важно, чтобы
PostsByTaxonomy
класс никогда не включал липкие посты, вы можете поместить его в конструктор:ОБНОВЛЕНИЕ 2
После публикации вышеизложенного я узнал, что 'caller_get_posts' устарела и
'ignore_sticky_posts'
будет использоваться в WordPress 3.1.источник
caller_get_posts=1
и они должны уйти: codex.wordpress.org/Function_Reference/… Надеюсь, это поможет.if(isset($query->posts_by_taxonomy))
хорошая уловка, чтобы объединить объектно-ориентированную методологию с методологией ловушек WordPress.Вы должны просто иметь возможность установить таксономию и отказаться от включения термина.
Например.
Это было бы почти так же, как запрос, выполняемый архивом таксономии.
источник
WP_Query
просто выбрасываете ее.WP_Query
к сожалению, не так элегантно. Это почти 1200 строк жестко закодированных особых случаев.