2015-05-01 81 views
0

我一直在嘗試創建一個自定義搜索查詢,並且我已經取得了一些進展,但又碰到了另一個roadbump。在wp_query中結合了關鍵字搜索和稅務查詢

我正在嘗試將w_query中的meta_query,關鍵字search('s')和tax_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還是給我找麻煩。我嘗試通過相同的方法添加它,但似乎在將它輸出到SQL查詢之前,wordpress會使用tax_query執行其他一些魔術。

這裏就是我有迄今:

 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正在比較輸出的SQL查詢中的tax_query值,這會在嘗試添加時導致問題。

任何幫助都會不勝感激。

編輯:澄清,我想在加:

'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的OR類型的關係增加了默認。

回答

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'); 

我只是添加posts_where並修改posts_join過濾器。

+0

這工作!我不得不改變回報$在哪裏。 'AND'。 「wter.slug like'%$ getname%''」;在哪裏返回$。 ' 要麼 '。 「wter.slug like'%$ getname%''」;但之後,它開始拉動標籤。太棒了。現在我只需要弄清楚如何讓變量$ getname正常工作,並且我將被設置。謝謝!在旁註:你知道爲什麼$ getname需要在這裏設置?我已經從URL中取出了一個GET,但是聲稱這個函數被調用時它是未定義的。 –