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

Существует ли простой способ запросить для каких-либо сообщений, который отмечен с каким-либо термином от конкретной таксономии?

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

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

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

Спасибо за Вашу справку, Dave

8
06.11.2010, 11:08
4 ответа

Ретроспективно, я имею, сделал мэшап MikeSchinkel и t31os предложения. Возможно ввести это к существующим запросам на лету, но этому нужен WordPress 3.1:

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

1
19.02.2020, 22:01

Привет @Dave Morris:

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

Существует три (3) основных подхода, которые Вы могли попробовать:

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

  2. Получите список $post->IDs для всех сообщений в Вашей таксономии и затем передают их использующий '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 файл, или можно использовать его в a .php файл плагина можно писать.

Если Вы хотите протестировать его быстро, я отправил автономную версию кода к Сути, которую можно загрузить и скопировать в корень веб-сервера как 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.

4
19.02.2020, 22:01
  • 1
    Mike, спасибо за Вашу справку. Я не могу заставить это работать по некоторым причинам. Это не возвращает только сообщения с условиями, присвоенными от моей пользовательской таксономии. Это всегда, кажется, возвращает другие сообщения. Однако это не возвращает все сообщения, таким образом, это определенно делает что-то... Могут я для использования $query-> have_posts () функционирую для итерации? Никакой метод, кажется, не работает на меня, так или иначе. –  Dave Morris 06.11.2010, 15:40
  • 2
    , это интересно. Я нашел запрос в журнале mysql, который получает два сообщения, которые я ожидаю, и он работает. Но по некоторым причинам, пять сообщений возвращаются, когда я циклично выполняюсь по $query-> сообщения. Единственная другая вещь, которую я замечаю, состоит в том, что непосредственно после того, как пользовательская таксономия отправляет выполнения запроса, другой запрос выполнения, который захватывает еще три сообщения их post_id. И затем я предполагаю, что все пять сообщений помещаются в один массив результатов. –  Dave Morris 06.11.2010, 16:07
  • 3
    я думаю, что понял это. Этот пользовательский запрос, кажется, включает липкие сообщения, даже при том, что они не находятся в той пользовательской таксономии. Какие-либо идеи о том, как соблюдать липкие сообщения правильно, или по крайней мере вытащить их из этого конкретного запроса? Спасибо, Dave –  Dave Morris 06.11.2010, 16:14
  • 4
    Хорошо они являются "липкими", правильно?:) Это - странное поведение, я думаю, но если Вы используете caller_get_posts=1 и они должны уйти: codex.wordpress.org/Function_Reference / … Hope это помогает. –  MikeSchinkel 06.11.2010, 18:54
  • 5
    Это if(isset($query->posts_by_taxonomy)) хороший прием должен объединить объектно-ориентированную методологию с методологией рычага WordPress. –  Jan Fabry 06.11.2010, 20:21

Необходимо просто смочь установить таксономию и инвертировать для включения термина..

Например.

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

Который в значительной степени совпал бы с запросом, архив таксономии работает.

1
19.02.2020, 22:01
  • 1
    Это не работает. –  Dave Morris 06.11.2010, 01:43
  • 2
    материала, 1432 проверок query.php или таксономии ИЛИ термина пуст, таким образом, Вы не можете только не передать краткий заголовок... Какие-либо другие идеи? –  Dave Morris 06.11.2010, 01:50
  • 3
    @t31os - Это было, мог бы первая реакция также; я был на самом деле сбит с толку им несколько раз, так как я продолжаю забывать. Но @Dave Morris является правильным; если это не пара таксономии/термина затем WP_Query просто выбрасывает его. –  MikeSchinkel 06.11.2010, 09:47
  • 4
    @t31os - Да, WP_Query к сожалению, не реализован таким изящным способом. Это - почти 1 200 строк трудно кодированных особых случаев. –  MikeSchinkel 06.11.2010, 19:06
  • 5
    "почти 1 200 строк трудно кодированных особых случаев"...., который сделал меня lol, имел к +1 комментарий... ;) –  t31os 06.11.2010, 19:19

Я встретился с аналогичной ситуацией Dave. Этот код добился цели в моих целях. Это не самая минимизированная опция в мире, но это делает задание хорошо:

// 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,
        ),
    ),
) );

Надо надеяться, эта справка Вы или кто-либо еще испытывающий проблему.

Kevin

22
19.02.2020, 22:01
  • 1
    Это было чрезвычайно полезно для меня. Спасибо @kevinlearynet –  Tyrun 22.10.2012, 23:26
  • 2
    Все еще относительный сегодня –  user1676224 18.10.2018, 18:59

Теги

Похожие вопросы