Intereting Posts
Как разбить строку из содержимого сетки и добавить элемент html PHP / SESSION: Логин один на пользователя? Как выводить HTML, но предотвращать атаки XSS Внутренняя кодировка PHP Предупреждение: невозможно изменить информацию заголовка – уже отправленные заголовки Имеет больше проблем с mysqli. Числовые данные в результатах Почта XAMPP не работает с функцией PHP mail () Как правильно обрабатывать международный характер в PHP / MySQL / Apache Является ли объектно-ориентированный PHP медленным? PHP FILTER_VALIDATE_EMAIL работает неправильно PHP HybridAuth социальный signin не работает вообще. Перенаправление на? Hauth.start = Facebook & hauth.time Как исправить ассоциативные ключи массива, которые не имеют одинарных кавычек в нескольких файлах Как я могу вернуть LastInsertID из PDO при использовании метода класса Как вы регистрируете все вызовы API с помощью Guzzle 6 Контентные и другие HTTP-заголовки?

Запросить несколько пользовательских терминов таксономии в WordPress 2.8?

Я создал пользовательскую таксономию с именем «технологии», но не могу запрашивать несколько терминов, как я могу, с категориями или тегами.

Эти запросы DO работают:

query_posts('tag=goldfish,airplanes'); query_posts('technologies=php'); 

Однако ни одно из следующих действий не работает правильно:

 query_posts('technologies=php,sql'); query_posts('technologies=php&technologies=sql'); 

Моя цель: показать все сообщения с технологией «php» и всеми сообщениями с технологией «sql»

Есть идеи? Возможно ли это? Благодаря!

По-видимому, query_posts не могут помочь в этой конкретной ситуации. (Надеюсь, он будет добавлен в будущих версиях WordPress!) Решение состоит в том, чтобы использовать пользовательский запрос выбора, например:

 SELECT * FROM $wpdb->posts LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id) LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) WHERE $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND $wpdb->term_taxonomy.taxonomy = 'technologies' AND $wpdb->terms.slug = 'php' OR $wpdb->terms.slug = 'css' ORDER BY $wpdb->posts.post_date DESC 

Более подробную информацию можно найти в WordPress Codex: http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Это немного отложенный ответ, но сначала он на Google для «сообщений, связанных с WordPress несколькими терминами», поэтому я подумал, что внес свои выводы.

Поскольку этот вопрос был опубликован, WordPress был изменен, чтобы разрешить этот тип запроса. Это даст вам список сообщений, связанных любым пользовательским термином таксономии, назначенным объекту:

 $post_cats = wp_get_object_terms(get_the_ID(), 'video_category', array('fields' => 'ids')); $args=array( "tax_query" => array( array( "taxonomy" => "video_category", "field" => "id", "terms" => $post_cats ) ), 'post__not_in' => array(get_the_ID()), 'post_type' => 'video', 'posts_per_page' => 8, 'caller_get_posts' => 1 ); $related_by_cats = new WP_Query($args); 

Это мой первый вклад в SO, я надеюсь, что это соответствует стандартам.

Вы можете использовать этот плагин:

http://scribu.net/wordpress/query-multiple-taxonomies/

Это работает? query_posts ( 'тег = хлеб + выпечка + рецепт')

От: http://codex.wordpress.org/Template_Tags/query_posts

Хорошо, так вот моя трещина. Он немного взломан, но он работает. Большой недостаток заключается в том, что любые другие переменные запроса должны быть добавлены повторно, так как при вызове нескольких терминов команда сбоев выдает все чары запросов.

Кроме того, я не тестировал это против запросов по нескольким таксономии. Это работает только в рамках определенной таксономии. Используйте на свой риск.

 function multi_tax_terms($where) { global $wp_query; if ( strpos($wp_query->query_vars['term'], ',') !== false && strpos($where, "AND 0") !== false ) { // it's failing because taxonomies can't handle multiple terms //first, get the terms $term_arr = explode(",", $wp_query->query_vars['term']); foreach($term_arr as $term_item) { $terms[] = get_terms($wp_query->query_vars['taxonomy'], array('slug' => $term_item)); } //next, get the id of posts with that term in that tax foreach ( $terms as $term ) { $term_ids[] = $term[0]->term_id; } $post_ids = get_objects_in_term($term_ids, $wp_query->query_vars['taxonomy']); if ( !is_wp_error($post_ids) && count($post_ids) ) { // build the new query $new_where = " AND wp_posts.ID IN (" . implode(', ', $post_ids) . ") "; // re-add any other query vars via concatenation on the $new_where string below here // now, sub out the bad where with the good $where = str_replace("AND 0", $new_where, $where); } else { // give up } } return $where; } add_filter("posts_where", "multi_tax_terms"); 

Как-то глупо, что после внедрения пользовательских таксономий в WP нет встроенных функций для их использования по желанию, а документация близка к несуществующей. Я искал решение, этот запрос решает его (и сделал мой день). Благодарю.

Тем не менее, к сожалению, я слишком тупой (ООП слепой), чтобы превратить его в функцию, поэтому я не повторяю все это. Я получаю: **Fatal error**: Call to a member function get_results() on a non-object

Думаю, я не знаю, как вызвать $ wpdb из функции.

это должно быть так:

  global $wp_query; query_posts( array_merge( array('taxonomy' => 'technologies', 'term' => array('sql', 'php')), $wp_query->query ) ); 

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

Эй, я тоже столкнулся с одной проблемой. Если у вас много разных значений, вы можете сделать это следующим образом, вместо написания необработанного SQL-запроса:

 $loop = new WP_Query(array('technologies' => 'php','technologies' => 'sql')); 

Затем вы можете прокрутить созданный здесь объект wp_query. Хотя это очень старый пост, и я уверен, что вы уже решили проблему. 🙂

  //equivalent to get_posts function brand_get_posts($args=array()){ global $wpdb; $sql = "SELECT p.* "; $sql.= " FROM $wpdb->posts p"; $sql.= " LEFT JOIN $wpdb->term_relationships term_r ON(p.ID = term_r.object_id)"; $sql.= " LEFT JOIN $wpdb->term_taxonomy term_t ON(term_r.term_taxonomy_id = term_t.term_taxonomy_id)"; $sql.= " LEFT JOIN $wpdb->terms terms ON(term_t.term_id = terms.term_id)"; $sql.= " WHERE 1=1 "; if(!empty($args['post_type'])){ $sql.= " AND p.post_type = '".$args['post_type']."'"; } $sql.= " AND p.post_status = 'publish'"; if(!empty($args['taxonomy'])){ $sql.= " AND term_t.taxonomy = '".$args['taxonomy']."'"; } if(!empty($args['terms'])&&is_array($args['terms'])){ $sql.= " AND terms.slug IN ('".implode(",",$args['terms'])."')"; } $sql.= " ORDER BY p.post_date DESC"; if(!empty($args['posts_per_page'])){ $sql.=" LIMIT ".$args['posts_per_page']; } if(!empty($args['offset'])){ $sql.=" OFFSET ".$args['offset']; } //echo '<h1>'.$sql.'</h1>'; return $wpdb->get_results($sql); }