2015-05-01 1 views
0

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

Я пытаюсь объединить meta_query, поиск по ключевым словам ('s') и tax_query в wp_query с отношением 'OR'.

Я получил meta_query и «S», чтобы работать вместе, благодаря этой фантастической пост: https://wordpress.stackexchange.com/questions/99849/search-that-will-look-in-custom-field-post-title-and-post-content

однако, tax_query еще дает мне неприятности. Я попытался добавить его с помощью того же метода, но кажется, что Wordpress делает какую-то другую магию с помощью tax_query, прежде чем он выведет ее в SQL-запрос.

Вот что у меня до сих пор:

 function add_join_wpse_news($joins) 
     { 
      global $wpdb; 
      return $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)" ; 
     } 
     function alter_search_wpse_news($search,$qry) 
     { 
      global $wpdb; 
      $add = $wpdb->prepare("({$wpdb->postmeta}.meta_key = '_et_builder_settings' AND CAST({$wpdb->postmeta}.meta_value AS CHAR) LIKE '%%%s%%')",$qry->get('s')); 
      $pat = '|\(\((.+)\)\)|'; 
      $search = preg_replace($pat,'(($1 OR '.$add.'))',$search); 
      return $search; 
     } 
     function alter_groupby_wpse_news($groupby) 
     { 
      global $wpdb; 

      $mygroupby = "{$wpdb->posts}.ID"; 
      if(preg_match("/$mygroupby/", $groupby)) { 
       // grouping we need is already there 
       return $groupby; 
      } 

      if(!strlen(trim($groupby))) { 
       // groupby was empty, use ours 
       return $mygroupby; 
      } 

      // wasn't empty, append ours 
      return $groupby . ", " . $mygroupby; 
     } 
     add_filter('posts_join','add_join_wpse_news'); 
     add_filter('posts_search','alter_search_wpse_news',1,2); 
     add_filter('posts_groupby', 'alter_groupby_wpse_news'); 

     $args_condensed = array 
     (
      'post_type' => 'news', 
      'paged' => $paged, 
      's' => $getname, 
     ); 
     $the_query = new WP_Query($args_condensed); 
     $max_pages = $the_query->max_num_pages; 
     echo $GLOBALS['the_query']->request; 

И это работает. Однако он не включает поиск тегов или категорий. Я попытался добавить его вручную через фильтр posts_join и posts_search, но потом понял, что Wordpress сравнивает значения в tax_query перед выпуском SQL-запроса, что вызывает проблемы при попытке добавить его.

Любая помощь будет очень оценили.

EDIT: для разъяснения, я пытаюсь добавить в:

'tax_query' => array 
      (
       'relation' => 'OR', 
       array //Search Tag 
       (
        'taxonomy' => 'post_tag', 
        'field' => 'slug', 
        'terms' => array($getname) 
       ), 
       array //Search Category 
       (
        'taxonomy' => 'category', 
        'field' => 'slug', 
        'terms' => array($getname), 
       ), 
       array //Search Category (Single Words) 
       (
        'taxonomy' => 'category', 
        'field' => 'slug', 
        'terms' => explode(" ",$getname), 
       ), 
       array //Search Tag (Single Words) 
       (
        'taxonomy' => 'post_tag', 
        'field' => 'slug', 
        'terms' => explode(" ",$getname), 
       ) 
      ), 

но с отношением типа ИЛИ, в отличие от отношений и WordPress добавляет по умолчанию.

ответ

2

Вы не можете использовать tax_query для этой цели. Вы должны переопределить фильтр, который предоставил Wordpress для архивирования этой миссии. Вот мой код. Надеюсь, он поможет:

function add_join_wpse_news($joins) 
    { 
     global $wpdb; 
     $joins = $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)" ; 
     $joins .= " inner join {$wpdb->term_relationships} as wrel on {$wpdb->posts}.ID = wrel.object_id"; 
     $joins .= " inner join {$wpdb->term_taxonomy} as wtax on wtax.term_taxonomy_id = wrel.term_taxonomy_id"; 
     $joins .= " inner join {$wpdb->terms} as wter on wter.term_id = wtax.term_id"; 

     return $joins; 

    } 
    function add_where_wpse_news($where) { 
     $getname = 'what you want'; 
     return $where. ' AND '. "wter.slug like '%$getname%' "; 
    } 
    add_filter('posts_join','add_join_wpse_news'); 
    add_filter('posts_where','add_where_wpse_news'); 

Я просто добавляю post_where и изменяю фильтр posts_join.

+0

ЭТО РАБОТАЕТ! Я должен был изменить return $ where. ' А ТАКЖЕ '. msgstr "wter.slug like '% $ getname%'"; для возврата $ where. ' ИЛИ ​​'. msgstr "wter.slug like '% $ getname%'"; Но после этого он начал тянуть по тегам. Фантастика. Теперь мне просто нужно выяснить, как заставить эту переменную $ getname работать правильно, и я буду установлен. Спасибо! На стороне примечания: знаете ли вы, почему здесь нужно установить $ getname? У меня есть ссылка на URL-адрес GET, но он утверждает, что он не определен при вызове этой функции. –