0

次のような状況で問題が発生しています: カスタム投稿タイプ (immobiliare) を検索するためのカスタム フォームを作成しており、これに添付されて、2 つのカスタム分類法があります: location と tipologia です。

私のsearchform.phpは次のとおりです。

<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ); ?>">
    <input type="hidden" value="proceed" name="s" id="s" />
    <fieldset>
      <legend>Ricerca per:</legend>
      <label class="screen-reader-text" for="query">Testo:</label>
          <input type="text" value="<?php the_search_query(); ?>" name="query" id="query" />
    </fieldset>
    <fieldset>
      <label class="screen-reader-text" for="s">Tipologia:</label>
          <?php wp_dropdown_categories(array(
            'hide_empty' => 0,
            'taxonomy' => 'tipologia',
            'name' => 'tipologia',
            'show_option_all' => 'Nessuna Preferenza'
          )); ?> 
    </fieldset>
    <fieldset>
      <label class="screen-reader-text" for="s">Località:</label>
          <?php wp_dropdown_categories(array(
            'hide_empty' => 0,
            'taxonomy' => 'location',
            'name' => 'location',
            'show_option_all' => 'Nessuna Preferenza'
          )); ?> 
    </fieldset>
    <input type="submit" id="searchsubmit" value="Search" />
</form>

ご覧のとおり、3 つのフィールドがあります。1 つはテキスト フィールドで、残りの 2 つは分類法のドロップダウンです。ユーザーがこれらのフィールドを検索できるようにしたい。空のクエリを送信できず、代わりに「クエリ」フィールドを追加できないため、「s」入力タイプをハックする必要がありました。私の functions.php ファイルは次のとおりです。

<?php

  // Start LOGGING
  if(!function_exists('_log')){
    function _log( $message ) {
      if( WP_DEBUG === true ){
        if( is_array( $message ) || is_object( $message ) ){
          error_log( print_r( $message, true ) );
        } else {
          error_log( $message );
        }
      }
    }
  }
  // end LOGGING

  // start SEARCH FORM
  function ij_get_int($var){
    if (isset($var)) {
      $int_var = intval($var);
      if ($int_var > 0)
        return $int_var;
    }
    return false;
  }

  function ij_get_str($var) {
    $str_var = esc_attr($var);
    if (strlen($str_var) > 0)
      return $str_var;
    return false;
  }

  function custom_search_results($query) {
    if ($query->is_search && $query->is_main_query()) {
      $tax_query = array(
        'relation' => 'AND',
      );
      $location = ij_get_int($_GET['location']);
      $tipologia = ij_get_int($_GET['tipologia']);
      if ($location) {
        array_push($tax_query, array(
           'taxonomy' =>   'location',
           'field'    =>   'id',
           'terms'    =>   $location,
           'operator' =>   'IN'
        ));
      }
      if ($tipologia) {
        array_push($tax_query, array(
           'taxonomy' =>   'tipologia',
           'field'    =>   'id',
           'terms'    =>   $tipologia,
           'operator' =>   'IN'
        ));
      }
      $query->set('tax_query', $tax_query);

      $query->set('s', ij_get_str($_GET['query']));
      $query->set('post_type', 'immobiliare');
    }
  }

  add_action('pre_get_posts', 'custom_search_results');
  // end SEARCH FORM

?>

ここで、カスタム フォームの応答にフックして、次を追加します。

  • ユーザーが有効なデータを入力したときの実際のクエリ ("s" ではなく "query")。
  • 必要に応じて、分類法によるフィルター。

これがうまくいかない理由がわかりません (1 日を費やしました!)。クエリが正しい 's' パラメータで返されていることがわかります。

$query->set('s', ij_get_str($_GET['query']));

分類フィルターではありません。

私は何を間違っていますか?search.php ファイルで標準のループを使用したいので、何らかの方法でフック関数をループに自動的に接続したいと考えています。興味深いことに、同じセットアップで新しい WP_Query オブジェクトを作成すると (「set」メソッドを使用しないで)、必要なものが正確に返されます。$query = new WP_Query をやってみました... しかし、これもうまくいきません!!

search.php の先頭にクエリ リクエストをダンプすると、次のようになります。

SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  WHERE 1=1  AND 0 = 1 AND (((wp_posts.post_title LIKE '%vil%') OR (wp_posts.post_content LIKE '%vil%')))  AND wp_posts.post_type = 'immobiliare' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10

共有するヒントはありますか?あなたは私に手を差し伸べてくれて本当にクールだろう!ありがとうダン

4

1 に答える 1

0

おそらくこれで解決しましたが、クエリには ... where 1=1 and 0=1 ... があるため、true と false の両方の項目のレコード セットを要求しているため、何も返されません。

于 2012-10-17T20:28:26.820 に答える