Wordpress - несколько объектов WP Query в один? - PullRequest
3 голосов
/ 28 августа 2009

В Wordpress возможно создание собственных WP Querys для цикла. Пример таков:

$my_query = new WP_Query(array('post_parent' => 3, 'post_type' => 'page'));

Другой пример:

$my_query = new WP_Query(array('cat' => 1, 'post_type' => 'post'));

Я хочу цикл, который представляет страницы и сообщения из одного цикла.

Теперь к моему вопросу. Можно ли объединить эти два объекта в один? Если это так, как? Я НЕ заинтересован в создании двух разных циклов.

Ответы [ 3 ]

2 голосов
/ 15 октября 2013

В случае, если вы не хотите делать это с SQL, именно так я и сделал свою страницу поиска.

Основная проблема: при выполнении meta_query WordPress думает, что я хочу, чтобы условие было соединено с «И» вместо «ИЛИ».

Итак, Wordpress ищет страницу с заголовком / содержимым = "myContent" И ключевым словом aioseop_key "myContent". Это (в моем случае) привело к нулевым результатам, несмотря на то, что была страница с соответствующим ключевым словом SEO.

Чтобы обойти это, я делаю два запроса. Звучит просто, НО: Цикл не хотел распознавать сообщения, несмотря на то, что в объекте $ post есть сообщения. Я нашел это решение после того, как взглянул на функцию have_posts () : она ссылается на другие переменные, кроме только объекта $ post.

$term = get_search_query(); // same as $_GET['s']

# the normal search:
$wordpress_keyword_search =& new WP_Query(array(
  's'         => $term,
  'showposts' => -1
));

# now push already found post IDs to an array, so we can exclude them from the meta search.
foreach ($wordpress_keyword_search->posts as $post_)
  $exclusion[] = $post_->ID;


# now do the meta query search
$aioseop_keyword_search =& new WP_Query(array(
  'post__not_in' => $exclusion,
  'post_type' => 'any',
  'showposts' => -1,
  'meta_query' => array(            
    array(
      'key'       => '_aioseop_keywords',
      'value'     => $term,
      'compare'   => 'LIKE',
    )
  )
));

# merge the two array posts.
# post_count and found_posts must be added together also. 
# otherwise have_posts() returns false.
# see: http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/query.php#L2886

$wordpress_keyword_search->posts       = array_merge($wordpress_keyword_search->posts, $aioseop_keyword_search->posts );
$wordpress_keyword_search->found_posts = $wordpress_keyword_search->found_posts + $aioseop_keyword_search->found_posts;
$wordpress_keyword_search->post_count  = $wordpress_keyword_search->post_count + $aioseop_keyword_search->post_count;

Затем используйте это в простом цикле:

if ($wordpress_keyword_search->have_posts()) {
  while($wordpress_keyword_search->have_posts()) {
    $wordpress_keyword_search->the_post();
    # now you simply can:
    the_title();
    the_content();

  }
} else {
  echo '<p>Sorry, no posts found</p>';
}
2 голосов
/ 29 августа 2009

то, что вы хотите, будет преобразовано в WHERE ... OR ... условие или UNION в SQL, например.

SELECT * FROM posts WHERE (post_parent = 3 AND post_type = 'page') 
  OR (cat = 1 AND post_type = 'post')

или

SELECT * FROM posts WHERE post_parent = 3 AND post_type = 'page'
  UNION
SELECT * FROM posts WHERE cat = 1 AND post_type = 'post'

взгляд на источник и способ, которым WP конструирует SQL из WP_Query () , я не думаю, что это возможно: нет ни OR'ing, ни UNION переменных запросов.

единственное, что мне приходит в голову, это написание плагина, который реализует фильтр posts_where (, примененный к предложению WHERE запроса, который возвращает массив записей ). Вы можете вызывать этот плагин с различными WP Querys, и плагин получит их WHERE части и сможет OR их вместе.

см. Также http://codex.wordpress.org/Custom_Queries

1 голос
/ 30 августа 2009

Я нашел решение сам. Я использую setup_postdata для анализа SQL-запроса.

Раствор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...