Пользовательская таксономия wp_query для всех условий в таксономии?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/3708

  •  16-10-2019
  •  | 
  •  

Вопрос

Есть ли простой способ запросить любые посты, которые помечены каким -либо сроком с точки зрения определенной таксономии?

Я знаю эту технику:

$custom_taxonomy_query = new WP_Query( 
 array(
  'taxonomy_name' => 'term_slug',
 )
);

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

Спасибо за вашу помощь, Дэйв

Это было полезно?

Решение

Оглядываясь назад, я сделал Mashup of Mikeschinkel и T31OS. Можно ввести это в существующие запросы на лету, но это требует WordPress 3.1:

Плагин для получения RSS -канала для постов, содержащих любой термин из таксономии.

Другие советы

Я столкнулся с подобной ситуацией, Дейв. Этот код сделал трюк для моих целей. Это не самый худой вариант в мире, но он хорошо справляется:

// Get all term ID's in a given taxonomy
$taxonomy = 'taxonomy_name';
$taxonomy_terms = get_terms( $taxonomy, array(
    'hide_empty' => 0,
    'fields' => 'ids'
) );

// Use the new tax_query WP_Query argument (as of 3.1)
$taxonomy_query = new WP_Query( array(
    'tax_query' => array(
        array(
            'taxonomy' => $taxonomy,
            'field' => 'id',
            'terms' => $taxonomy_terms,
        ),
    ),
) );

Надеемся, что это поможет вам или кому -либо еще, испытав проблему.

Кевин

Что -то подобное может сработать:

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'your_custom_taxonomy',
            'operator' => 'EXISTS'
        ),
    ),
);
$query = new WP_Query( $args );

Вы в основном запрашиваете любой пост, назначенный на любой термин в рамках your_custom_taxonomy.

Привет @Dave Morris:

Вы правы, WordPress решает, если у вас нет термина, они просто игнорируют вашу таксономию.

Есть три (3) основные подходы Вы можете попробовать:

  1. Используйте полный запрос SQL с $wpdb->get_results(),

  2. Получить список $post->IDс Для всех постов в вашей таксономии, а затем передайте их, используя 'post__id' аргумент, или

  3. Аннотировать SQL, используемый WP_Query с одним из крючков, которые позволяют добавить SQL INNER JOIN Ссылка на таксономические таблицы.

Я стараюсь избегать полного SQL в WordPress до тех пор, пока ему не удастся не помочь, либо это просто возвращает список идентификаторов. И в этом случае я бы избежал сохранения списка $post-IDS для использования с 'post__id' Аргумент, потому что он может столкнуться с проблемами производительности и даже проблем с памятью, если у вас было много постов. Так что это оставляет нас с № 3.

Я создал класс для расширения WP_Query называется PostsByTaxonomy который использует 'posts_join' крюк. Вы можете видеть это здесь:

class PostsByTaxonomy extends WP_Query {
  var $posts_by_taxonomy;
  var $taxonomy;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    unset($args['taxonomy']);
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_by_taxonomy)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  AND {$wpdb->term_taxonomy}.taxonomy='{$this->taxonomy}'
SQL;
    }
    return $join;
  }
}

Вы бы назвали этот класс, как видите ниже. Аргумент 'taxonomy' требуется Но вы можете пройти любой (все?) других параметров, которые WP_Query ожидает, например 'posts_per_page':

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
));
foreach($query->posts as $post) {
  echo " {$post->post_title}\n";
}

Вы можете скопировать PostsByTaxonomy класс на вашу тему functions.php файл или вы можете использовать его в .php Файл плагина, который вы можете писать.

Если вы хотите быстро это проверить, я опубликовал автономная версия кода Чтобы GIST, который вы можете скачать и скопировать в корне вашего веб -сервера как test.php, измените для вашего варианта использования, а затем запросите из вашего браузера, используя URL -адрес http://example.com/test.php.

ОБНОВИТЬ

К Опустите липкие посты Из постов, включенных в запрос, попробуйте это:

$query = new PostsByTaxonomy(array(
  'taxonomy' => 'category',
  'posts_per_page' => 25,
  'caller_get_posts' => true,
));

Или если для вас важно, чтобы PostsByTaxonomy Класс никогда не включает в себя липкие посты, которые вы можете поместить в конструктор:

  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    $this->posts_by_taxonomy = true;
    $this->taxonomy = $args['taxonomy'];
    $args['caller_get_posts'] = true     // No Sticky Posts
    unset($args['taxonomy']);
    parent::query($args);
  }

Обновление 2

После публикации вышеупомянутого я узнал, что «caller_get_posts» будет устарел и 'ignore_sticky_posts' будет использоваться в WordPress 3.1.

Вы должны просто установить таксономию и отрицать, чтобы включить термин ..

Например.

<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>

Что было бы таким же, как и запрос архив таксономии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top