下拉列表:仅当与所选术语A有关系时才显示B中的术语

时间:2012-11-12 作者:Daniel Semblano

我在谷歌上搜索了这个问题的解决方案,但什么也没找到:我有一些来自自定义帖子类型(餐馆)及其分类(“城市”和“美食”)的帖子。每当我创建一个餐厅帖子时,我可以根据自己的需要设置许多“烹饪”术语,但“城市”是单选的。我还使用html下拉列表进行了自定义搜索,我可以从“餐馆”的帖子中通过过滤分类术语进行搜索。

搜索效果很好,但我真正想要的是在第二个分类法(烹饪法)中只填充与所选第一个分类法(城市)有某种关系的术语。在第一个下拉列表中,如果有人选择“纽约”,则第二个下拉列表必须仅显示餐厅帖子上与“纽约”市相关的烹饪术语。如果没有“巴西人”美食和“纽约市”注册的帖子,“巴西人”一词不得出现在第二个下拉列表中。当然,烹饪下拉列表不必显示重复的术语。

这可能吗?提前感谢!

2 个回复
最合适的回答,由SO网友:developdaly 整理而成

以下是部分答案。。。如何查询您要查找的术语。但听起来您需要一些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
            )
        )
    );

?>

SO网友:Daniel Semblano

很抱歉回复延迟了很长时间,但感谢各位的帮助,这是很好的参考资料!

wordpress的vtxyzy。org论坛帮助我处理查询部分,ajax和php是我自己做的,不知道是否整洁。下面是最终代码在函数中的形式。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\');

结束

相关推荐

WordPress是否限制Post Meta或Terms的插件名称的长度?

WordPress Codex指出,帖子类型名称和分类名称对slug名称有限制。Register Post Type -- 最多20个字符,不能包含大写字母或空格Register Taxonomy -- 分类的名称。名称应为插入形式(不得包含大写字母或空格),长度不得超过32个字符(数据库结构限制)</然而,WordPress Codex没有说明Post Meta或Terms是否对slug名称有限制。Add Post Meta -- 无缓动限制Insert Term -- 无缓动限制</这能得