web-dev-qa-db-ja.com

プラグインによる検索フィルタの作成

私は不動産プロジェクトのためにワードプレスを使用しています、そのために、私は不動産へのプラグイン(不動産不動産)と一緒にテーマを使用しています。私の質問は単純です、私はproperty_baths(bathrooms)、property_beds(rooms)などのようないくつかのカスタムmeta_keyを持っています。 「投稿」タブのワードプレス管理の高度な検索。私は、この検索が累積的であることも必要です。例えば、 "bathrooms"と "rooms"の両方が埋められている場合は、埋められた内容に従って投稿をフィルタリングする必要があります。

多くの検索の結果、プラグインを作成することでこれを実行する方法を見つけましたが、ここにあるコードでは、meta_valueと一緒にmeta_keyを1つだけ渡しています。

私がこれまでに持っているのはこれです:

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );

function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //only add filter to post type you want
    if ('property' == $type){
        //change this to the list of values you want to show
        //in 'label' => 'value' format
        $values = array(
            'Banheiros' => 'property_baths', 
            'Quartos' => 'property_beds'
        );

        $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
        foreach ($values as $label => $value) {
            printf
            (
            '<input type="text" name="%s"%s placeholder="%s"></option>',
            $value, 
            $value == $current_v? ' value="'.$current_v.'"':'', 
            $label 
            );
        }
    }
}

add_filter('parse_query', 'wpse45436_posts_filter');

function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_baths']) && $_GET['property_baths'] != '') {

        $query->query_vars['meta_key'] = 'property_baths';
        $query->query_vars['meta_value'] = $_GET['property_baths'];
    }
}

このコード(プラグイン)では1つのmeta_keyしかフィルタできません。いくつかの "meta_keys"をそれらの値で使用できるようにする必要があります。

私はループを試した、私は配列を試したが、何もうまくいきませんでした。誰かが私を助けることができると思います...事前に感謝します...

2

複数のフィルタ呼び出しを追加することができます。そのため、カスタムのmeta_keyはそれぞれ別々のコードで処理でき、実行時にクエリが累積的に調整されます。

おそらく、pre_get_postsではなくparse_queryフィルターを見てください(私が提案している解決策はどちらの場合でもうまくいく可能性があります)。 pre_get_postsはWordPressによって実行される前にあなたに現在の問い合わせへのアクセスを与えます、そしてあなたは問い合わせがデータベースから取得する投稿を制限します。

私はこのコードをテストしていません:これはあなたのコードに対してここで編集することです。

あなたはこのようなものになってしまうでしょう:

add_filter('pre_get_posts', 'wpse45436_property_baths_posts_filter');

function wpse45436_property_baths_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_baths']) && $_GET['property_baths'] != '') {

        $query->query_vars['meta_key'] = 'property_baths';
        $query->query_vars['meta_value'] = $_GET['property_baths'];
    }
}

add_filter('pre_get_posts', 'wpse45436_property_beds_posts_filter');

function wpse45436_property_beds_posts_filter( $query ){
    global $pagenow;
    $type = 'property';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'property' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['property_beds']) && $_GET['property_beds'] != '') {

        $query->query_vars['meta_key'] = 'property_beds';
        $query->query_vars['meta_value'] = $_GET['property_beds'];
    }
}

pre_get_postsフィルターの詳細については Codex を確認してください。

1
Paul Zee