カスタム分類およびカスタムフィールド用のフィルターを備えた高度な検索フォーム


30

特定のカスタム投稿タイプ用の高度な検索フォームを作成し、カスタム投稿タイプのカスタムフィールド、カスタム分類、および個別のカスタム投稿タイププロパティ(フィールドと分類)のフィルターを作成して、最初のカスタム関係フィールドを使用した投稿タイプ。

私は最近、WPのカスタム投稿タイプ、フィールド、および分類法から始めました。これまでのところは気に入っていますが、それを最大限に活用するために、適切に検索できるようにしたいと思います。手動で行う必要がありますか?もしそうなら、どのように?

PS。問題があれば、プラグインを使用しています:Advanced Custom FieldsおよびCustom Post Type UI

以下では、フィルタリングがどのように見えるか、およびそれが上記の投稿タイプにどのように関連するかについての例をモックアップしました。

カスタムフィールドとカスタム分類によってフィルタリングされたワードプレスのカスタム検索フォーム


誰かが上記のBradyのソリューションを実装するのに苦労している場合(私がやったように)ここにヒントがあります:Wordpressにはセッションデータの受け渡しにいくつかの問題があるようです。ここで問題について説明します:frank-verhoeven.com/using-session-in-wordpress Peter Woosterの「Simple Session Support」プラグインをインストールしてくれたので、うまくいきました。投稿のコメントセクションにプラグインへのリンクがあります。
SteveR

回答:


16

このようなものは、自分で書くのがベストだと思います。

ご覧くださいhttp : //www.catalysthomes.co.uk/homes-for-sale/

プロパティはCPTに読み込まれ、サイドバーに独自のカスタム検索があります。この検索で​​は、分類法、カスタムフィールド、日付価格などの順序付けなど、多くのことを検索します。

それでは、どうすればこれを達成できますか?フォームをページテンプレートに送信し、そこから投稿データを処理し、検索条件に基づいて新しいWP_queryを作成します。結果をページ分割できるように、セッションを使用して検索変数を保存します。

WP_Queryは非常に強力です。ご覧くださいhttp : //codex.wordpress.org/Class_Reference/WP_Query

ここでは、meta_query複数のカスタムフィールドのクエリに使用できtax_query、分類法のクエリに使用できます。以下は、私のアイデアをどのように構築するかを示しています。

テンプレートファイル:

  <?php
  $temp = $wp_query;
  $wp_query = NULL;
  $args = array();
  ?>

  <?php include("functions/Homes-for-sale/propertyrawresults.php"); ?>
  <?php include("functions/Homes-for-sale/propertysearchresults.php"); ?>

  <?php
  $args['post_type'] = "homes-for-sale";
  $args['showposts'] = 10;
  $args['paged'] = $paged;
  $wp_query = new WP_Query($args);
  ?>

  <?php include("functions/Homes-for-sale/propertylistlayout.php"); ?>

生の結果

<?php
if($_POST['sortby']) {
    $_SESSION['prop_selectedsortby'] = $_POST['sortby'];
}

switch($_SESSION['prop_selectedsortby']) {
    case "name-asc": $args['order'] = "ASC"; $args['orderby'] = "title"; break;
    case "name-desc": $args['orderby'] = "title"; break;
    case "price-asc": $args['order'] = "ASC"; $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
    case "price-desc": $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
    case "date-asc": $args['order'] = "ASC"; break;
    default: /* No need to set arguments here as wp query defaults */ break;
}

$selectedsortby[$_SESSION['prop_selectedsortby']] = " selected=\"selected\"";
?>

の検索結果

<?php
if( ! empty( $_SESSION['s_property_ptype'] ) ) {
    $args['meta_query'][] = array(
        'key' => 'chb_homes_for_sale_types_nbrs',
        'value' => $_SESSION['s_property_ptype']
    );
}

if( ! empty( $_SESSION['s_property_development'] ) ) {
    $args['meta_query'][] = array(
        'key' => 'chb_homes_for_sale_ofdevelopment',
        'value' => $_SESSION['s_property_development']
    );
}

if( isset( $_SESSION['s_property_area'] ) && 0 != $_SESSION['s_property_area'] ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'areas',
        'field' => 'id',
        'terms' => array( (int) $_SESSION['s_property_area'] ),
    );
}

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bedrooms',
    'value' => $_SESSION['s_property_bedrooms_min'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bedrooms',
    'value' => $_SESSION['s_property_bedrooms_max'],
    'compare' => '<=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bathrooms',
    'value' => $_SESSION['s_property_bathrooms_min'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bathrooms',
    'value' => $_SESSION['s_property_bathrooms_max'],
    'compare' => '<=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_fmv',
    'value' => $_SESSION['s_property_min_price'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_fmv',
    'value' => $_SESSION['s_property_max_price'],
    'compare' => '<=',
    'type' => 'SIGNED'
);
?>

リストレイアウト ポストの抜粋と情報を表示する標準のWPループ。


こんにちはBrady、この例ではThx。可能であれば、フォームを共有してもらえますか?その中で、どのURLに送信していますか?
サロシン

@salocin -その情報は答えで与えられたURLのページのソースを見ることで得することができます
ブレイディ

thx Brady、ページテンプレートのURL?
サロシン

フォームはCatalysthomes.co.ukにあります。ソースを表示し、フォームがどのように機能するかを見ることができます
ブレイディ

カスタム分類にカスタムフィールドとしての投稿があるかどうかを確認しますか?検索フォームにどのくらい正確に入力していますか?@Bradyありがとう
Phil Hudson

2

Relevanssiと一緒に Taxonomy Pickerプラグインをお試しください。キラーの組み合わせ。

http://www.squidoo.com/taxonomy-picker-wordpress-plugin http://wordpress.org/extend/plugins/relevanssi/


これはポスト関係を考慮していません。それは私の問題の難しい部分です。分類法で投稿をフィルタリングする方が簡単です。関連する投稿の分類法(またはカスタムフィールド)を購入するようにフィルタリングする必要があります。
pax

0

Relevanssiプラグインを見てください、それはあなたが探しているものをするかもしれません:http ://wordpress.org/extend/plugins/relevanssi/


(特定のフィルターを使用した)私が必要とするアプローチには合いませんが、非常に興味深いプラグインであり、デフォルトの検索機能の優れた代替品のように見えます。
pax

0

誰かが上記のBradyのソリューションを実装するのに苦労している場合(私がやったように)ここにヒントがあります:WordPressにはセッションデータの受け渡しにいくつかの問題があるようです。ここで問題について説明します

functions.phpで:

function init_sessions() {
  if (!session_id()) {
  session_start();
 }
}
add_action('init', 'init_sessions');

テンプレートで:

/**
* Enable sessions
*/
if (!session_id())
session_start();

私にとって、Peter Woosterの「Simple Session Support」プラグインをインストールするとうまくいきました。


1
こんにちはスティーブ。最初の回答をここに投稿していただきありがとうございます。WPSEでお会いできて嬉しいです。将来の参考のために、回答は外部リンク上で完全にピボットするべきではありません。リンクが無効になっている場合、答えは無害になります。関連するコードスニペットのサンプルをいくつか使用して、回答を更新してもよろしいですか?
ブライアンフェクター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.