shaun
  • 0
Новичок

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

  • 0

( Примечание модераторов : изначально называлось «Как получить_сообщения пользовательского типа сообщений, которые находятся в двух пользовательских таксономиях?» )

У меня есть настраиваемый тип сообщения, который имеет две отдельные таксономии: одна называется «Тип проекта», а другая — «Пакет». Мне нужно получить список проектов «Тип проекта» A и «Пакет» A . Я попытался использовать следующий код:

$args = array(
  'post_type' => 'portfolio', 
  'numberposts' => -1, 
  'project_type' => 'A', 
  'package' => 'A'
); 
$my_posts = get_posts($args);  

Но это получает все сообщения, которые ЛИБО находятся в проекте типа A ИЛИ в пакете A.

Есть ли способ сказать get_posts(), что я хочу вернуть только те сообщения, которые находятся в ОБЕИХ таксономиях?

Share
  1. Начиная с версии 1.3, плагин Query Multiple Taxonomies отлично работает с WP_Query. Ваши исходные аргументы работают как есть.

    $args = array(
    'post_type' => 'portfolio',
    'numberposts' => -1,
    'project_type' => 'A',
    'package' => 'A'
    );
    

    Затем сделайте новый запрос и проверьте его:

    $foo = new WP_Query($args);
    var_dump($foo->posts);
    

    Я проверил это на своей собственной пользовательской настройке таксономии, и она вернула только сообщения, соответствующие обоим терминам в запросе.

    Еще один удобный способ получения нескольких терминов таксономии с помощью QMT — создание простых запросов URL:

    site.com/?post_type=portfolio&package=foo&project=bar
    

    Я использовал этот метод с add_query_args() функцией для создания ссылок на странице, которые изменяют текущий запрос, уточняя его, добавляя дополнительные термины и таксономии. Синтаксис также отлично работает с поисковым вводом, так как несколько слов в поле ввода публикуются как foo+bar, что отлично работает с QMT:

    site.com/?post_type=portfolio&project=alpha&colors=red+blue+green
    

    Который возвращает только сообщения, которые соответствуют всем этим критериям — Тип: Портфолио / Проект: Альфа / Цвета: красный + синий + зеленый

    • 0
  2. Привет @shaun :

    @Rarst прав в том, что они добавляют эту функциональность в WordPress v3.1, но ее не будет здесь какое-то время, и я уверен, что она вам нужна сейчас. Вы можете попытаться получить код, над которым они работают, и попытаться заставить его работать, вы можете использовать плагин, упомянутый как @Rarst, так и @somatic, или вы можете просто включить код, который вам нужен, в свою тему, как показано ниже.

    Следующий код представляет собой posts_where хук для добавления tax_terms переменной запроса со значением формата (т.е. двоеточие-запятая), где значения являются слагами терминов :

    "{$varname1}:{$value1},{$varname2}:{$value2},...{$varnameN}:{$valueN}"
    

    Это автономный файл, .php который вы можете поместить в корень вашего веб-сайта, чтобы протестировать его, прежде чем вставлять add_action вызов и tax_terms_where() функцию в functions.php файл вашей темы (или в .php файл одного из ваших собственных плагинов).

    <?php
    /*
    * Adds "tax_terms" to WP_Query()
    *
    * See: http://lists.automattic.com/pipermail/wp-hackers/2010-October/035258.html
    * See: http://wordpress.stackexchange.com/questions/2255/
    *
    */
    
      header('Content-Type:text/plain');
      include "wp-load.php";
      add_action('posts_where','tax_terms_where',10,2);
    
      $result = new WP_Query('post_type=portfolio&tax_terms=project_type:A,package:A');
      foreach($result->posts as $post) {
        echo "{$post->post_title}\n";
      }
    
    function tax_terms_where($where,$wp_query) {
      if (isset($wp_query->query)) {
        $query = $wp_query->query;
        if (is_string($query))
          parse_str($query,$query);
        if (is_array($query) && isset($query['tax_terms'])) {
          global $wpdb;
          $tax_terms = explode(',',$query['tax_terms']);
          foreach($tax_terms as $tax_term) {
            list($taxonomy,$term) = explode(':',$tax_term);
            $sql = <<<SQL
    AND $wpdb->posts.ID IN (
      SELECT tr.object_id
      FROM $wpdb->term_relationships AS tr
      INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
      INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id
      WHERE tt.taxonomy='%s' AND t.slug='%s'
    )
    SQL;
            $where .= $wpdb->prepare($sql,$taxonomy,$term);
          }
        }
      }
      return $where;
    }
    

    Если это не совсем то, что вам нужно, потому что, например, вы предпочитаете сопоставлять, $term->term_id а не сопоставлять, $term->slug тогда код не должен быть слишком сложным для ваших нужд, при условии, что вы знакомы с SQL и .php .

    • 0
  3. Старый Q, но, по-видимому, появляется, так что вот текущее состояние — запросы таксономии были значительно улучшены в версии 3.1 и позже.

    В наши дни это легко обработать налоговым запросом, используя AND отношения, например из Кодекса:

    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'movie_genre',
            'field'    => 'slug',
            'terms'    => array( 'action', 'comedy' ),
        ),
        array(
            'taxonomy' => 'actor',
            'field'    => 'term_id',
            'terms'    => array( 103, 115, 206 ),
            'operator' => 'NOT IN',
        ),
    ),
    

    Полную документацию см. в разделе Параметры таксономии.


    Обычный отказ от ответственности — я сам до сих пор не возился с пользовательскими вещами.

    Я думаю, что сложные запросы таксономии не реализованы в ядре WP (пока). Попробуйте плагин Query Multiple Taxonomies.

    • 0

Оставить ответ

You must login to add an answer.