web-dev-qa-db-ja.com

ドロップダウン:選択した用語Aと関係がある場合にのみBの用語を表示する

私はこの問題の解決策についてグーグルしても何も見つけませんでした:私はカスタムポストタイプ(レストラン)とその分類法(「都市」と「料理」)からの投稿をいくつか持っています。レストランの投稿を作成するときはいつでも、好きなだけ「料理」の用語を設定できますが、「都市」は単一選択です。私はまた、分類用語からフィルタリングすることで 'レストラン'投稿から検索できるHTMLドロップダウンを使用してカスタム検索を行いました。

検索はうまく機能しますが、私が本当に望んでいるのは、選択された最初の分類法(都市)に基づいて何らかの関係を持つ用語のみを2番目の分類法(料理)に取り込むことです。最初のドロップダウンで、誰かが「ニューヨーク」の都市を選択した場合、2番目のドロップダウンでは、レストランの投稿に「ニューヨーク」の都市用語と関係がある料理用語のみを表示する必要があります。 「ブラジル」料理と「ニューヨーク」市登録の投稿がない場合は、「ブラジル」という用語は2番目のドロップダウンに表示されてはいけません。もちろん、料理のドロップダウンに重複した用語を表示する必要はありません。

それは可能ですか?前もって感謝します!

3
Daniel Semblano

これが答えの一部です...あなたが探している用語を問い合わせる方法。しかし、それはあなたがそれぞれの選択について再クエリするためにいくらかのajaxが必要であるように思えます。

市と料理は動的ですが、基本的にユーザーが市を選択したときにそのデータが$city変数に入力されます。

他の誰かがajaxの部分に慣れる必要があるでしょう。

<?php

    $city = array( 'dallas' );
    $cuisine = array( 'italian', 'mexican', 'french );

    $args = array(

        'post_type' => 'restaurant',
        'posts_per_page' => -1,
        'tax_query' => array(
        'relation' => 'AND',
             array(
                'taxonomy' => 'city',
                'field' => 'slug',
                'terms' => $city
            ),
            array(
                'taxonomy' => 'cuisine',
                'field' => 'slug',
                'terms' => $cuisine
            )
        )
    );

?>
2
developdaly

返信が遅くなってすみませんが、ご協力ありがとうございました。

wordpress.orgフォーラムのvtxyzzyは、クエリー部分を手助けしてくれました、ajaxとphpは自分でやってくれました。これが、最終的なコードがfunctions.phpになった方法です。

function restaurant_search( $taxonomy ) {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            $('#cidade').change(function(){
            var cidade=jQuery('#cidade').val();
                $.ajax({
                    url:"<?php bloginfo('wpurl'); ?>/wp-admin/admin-ajax.php",
                    type:'POST',
                    data:'action=category_select_action&name=' + cidade,
                    success:function(results)
                    {
                    $("#cozinha").html(results);
                    }
                 });
            });
        });
    </script>

<form action="<?php echo home_url('/'); ?>" role="search" method="get">
    <?php // First dropdown
        $term_selected_cidade = get_terms('cidade');
        echo '<select id="cidade" name="cidade">';
        echo '<option disabled="disabled" selected="selected">Cidade</option>';
        foreach ($term_selected_cidade as $term) {
            echo '<option id=' . $term->term_id . ' value=' . $term->slug . '>' . $term->name . '</option>';
        }
        echo '</select>';

    ?>

    <!-- Second Dropdown -->
    <select name="cozinha" id="cozinha" >
        <option>Escolha uma cidade</option>
    </select>
    <input type="submit" value="buscar" />
</form>

<?php }

function implement_ajax() {
    // Populates the second dropdown with cuisine terms
    global $wpdb;
    $cozinha_term = $_POST['name'];
    $query = "
        SELECT DISTINCT $wpdb->terms.name, $wpdb->terms.slug
        FROM $wpdb->terms
        INNER JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id=$wpdb->term_taxonomy.term_id
        INNER JOIN $wpdb->term_relationships ON $wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id
        LEFT JOIN $wpdb->posts ON $wpdb->posts.ID=$wpdb->term_relationships.object_id
        WHERE $wpdb->term_taxonomy.taxonomy='cozinha' AND $wpdb->posts.ID IN (
        SELECT $wpdb->posts.ID
        FROM $wpdb->terms
        INNER JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id=$wpdb->term_taxonomy.term_id
        INNER JOIN $wpdb->term_relationships ON $wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id
        LEFT JOIN $wpdb->posts ON $wpdb->posts.ID=$wpdb->term_relationships.object_id
        WHERE $wpdb->term_taxonomy.taxonomy='cidade' AND $wpdb->terms.slug='$cozinha_term')";

    $object = $wpdb->get_results($query);
    $cuisine_terms = array();
    for ($i = 0; $i < count($object); $i++) {
        $cuisine_terms[] = get_object_vars($object[$i]);
    }

    echo '<select id="cozinha">' . '<option disabled="disabled" selected="selected">Cozinha</option>';
    foreach ($cuisine_terms as $term) {
        echo '<option value=' . $term['slug'] . '>' . $term['name'] . '</option>';
    }
    echo '</select>';
}

add_action('wp_ajax_category_select_action', 'implement_ajax');
add_action('wp_ajax_nopriv_category_select_action', 'implement_ajax');
0
Daniel Semblano