是否将自定义分类的选择限制为一个?

时间:2011-01-16 作者:Bainternet

我有一个带有CPT(custom post type的缩写)“bagp\\u deals”和自定义分类法“ba\\u locations”和“ba\\u cats”的站点,基本上它的post type“deals”以“Location”和“Categories”作为层次分类法。在默认的编辑屏幕上,我想将选择限制为每个选项中的一个(一个位置和一个类别),并且我正在尝试使用JQuery来实现这一点,我注意到ba\\U位置的字段自定义分类命名为“tax\\u input[ba\\U locations][]”,到目前为止,我有以下代码:

jQuery("input[name=tax_input[ba_locations][]]").click(function () {
    selected = jQuery("input[name=tax_input[ba_locations][]]").filter(":checked").length;
    if (selected > 1){
        jQuery("input[name=tax_input[ba_locations][]]").each(function () {
                jQuery(this).attr("checked", false);
        });
        jQuery(this).attr("checked", true);
    }
});
假设witch将复选框选择限制为一个。由于某种原因,我不能让它工作。

The Question

所以问题是为什么这不起作用?或者您是否有更好的解决方案将选择限制为一个?

非常感谢您的帮助。

更新:

这是我使用的工作代码:

jQuery("input[name=\\"tax_input[ba_locations][]\\"]").click(function () {
    selected = jQuery("input[name=\\"tax_input[ba_locations][]\\"]").filter(":checked").length;
    if (selected > 1){
        jQuery("input[name=\\"tax_input[ba_locations][]\\"]").each(function () {
                jQuery(this).attr("checked", false);
        });
        jQuery(this).attr("checked", true);
    }
});

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

与其用jQuery对其进行黑客攻击,更可靠的解决方案是用您自己的PHP替换元框。

无论如何,选择器中的“[”和“]”字符很可能存在问题:

"input[name=tax_input[ba_locations][]]"
可以重写为

"input[name=tax_input\\\\[ba_locations\\\\]\\\\[\\\\]]"
请参见https://stackoverflow.com/questions/2786538/need-to-escape-a-special-character-in-a-jquery-selector-string

SO网友:zviryatko

我为您提供了一个php解决方案:

add_filter(\'wp_terms_checklist_args\', \'htmlandcms_select_one_category\');
function htmlandcms_select_one_category($args) {
    if (isset($args[\'taxonomy\']) && $args[\'taxonomy\'] == \'category_portfolio\') {
        $args[\'walker\'] = new Walker_Category_Radios;
        $args[\'checked_ontop\'] = false;
    }
    return $args;
}

class Walker_Category_Radios extends Walker {
    var $tree_type = \'category\';
    var $db_fields = array (\'parent\' => \'parent\', \'id\' => \'term_id\');

    function start_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\\t", $depth);
        $output .= "$indent<ul class=\'children\'>\\n";
    }

    function end_lvl( &$output, $depth = 0, $args = array() ) {
        $indent = str_repeat("\\t", $depth);
        $output .= "$indent</ul>\\n";
    }

    function start_el( &$output, $category, $depth, $args, $id = 0 ) {
        extract($args);
        if ( empty($taxonomy) )
            $taxonomy = \'category\';

        if ( $taxonomy == \'category\' )
            $name = \'post_category\';
        else
            $name = \'tax_input[\'.$taxonomy.\']\';

        /** @var $popular_cats */
        $class = in_array( $category->term_id, $popular_cats ) ? \' class="popular-category"\' : \'\';
        /** @var $selected_cats */
        $output .= "\\n<li id=\'{$taxonomy}-{$category->term_id}\'$class>" . \'<label class="selectit"><input value="\' . $category->term_id . \'" type="radio" name="\'.$name.\'[]" id="in-\'.$taxonomy.\'-\' . $category->term_id . \'"\' . checked( in_array( $category->term_id, $selected_cats ), TRUE, FALSE ) . disabled( empty( $args[\'disabled\'] ), FALSE, FALSE ) . \' /> \' . esc_html( apply_filters(\'the_category\', $category->name )) . \'</label>\';
    }

    function end_el( &$output, $category, $depth = 0, $args = array() ) {
        $output .= "</li>\\n";
    }
}

SO网友:Andrew

我不知道你是否找到了解决方法,但我需要做同样的事情。我接受了您的jQuery并为名称添加了引号+转义了它们。对我来说似乎工作得很好,所以感谢原始jQuery:)

    jQuery("input[name=\\"tax_input[location][]\\"]").click(function () {
        selected = jQuery("input[name=\\"tax_input[location][]\\"]").filter(":checked").length;
        if (selected > 1){
            jQuery("input[name=\\"tax_input[location][]\\"]").each(function () {
                    jQuery(this).attr("checked", false);
            });
            jQuery(this).attr("checked", true);
        }
    });
我的分类输入称为位置,而不是ba\\U位置。

SO网友:Picard102

这是我在函数中加入的内容,但我似乎没有得到预期的结果。

<?php add_action( \'admin_head\', \'cat_sel\' ); function cat_sel() {    ?>

<script type="text/javascript">
jQuery(document).ready(function($) {
  jQuery("input[name=\\"tax_input[rooms][]\\"]").click(function () {
    selected = jQuery("input[name=\\"tax_input[rooms][]\\"]").filter(":checked").length;
    if (selected > 1){
        jQuery("input[name=\\"tax_input[rooms][]\\"]").each(function () {
                jQuery(this).attr("checked", false);
        });
        jQuery(this).attr("checked", true);
    }
  });
});

</script>
<?php } ?>

SO网友:Walf

的简化版本@sviryatko\'s PHP解决方案:

namespace {
    require_once(ABSPATH . \'wp-admin/includes/class-walker-category-checklist.php\');
    class Walker_Category_Radioset extends Walker_Category_Checklist {
        public function start_el(&$output, $category, $depth = 0, $args = array(), $id = 0) {
            $parent_output = \'\';
            parent::start_el($parent_output, $category, $depth, $args, $id);
            $output .= str_replace(\'checkbox\', \'radio\', $parent_output);
        }
    }
}
以及

add_filter(
    \'wp_terms_checklist_args\'
    , function($args) {
        if (isset($args[\'taxonomy\']) && $args[\'taxonomy\'] == YOUR_TAXONOMY) {
            $args[\'walker\'] = new \\Walker_Category_Radioset;
            $args[\'checked_ontop\'] = false;
        }
        return $args;
    }
);

结束

相关推荐

$未在WordPress中使用jQuery定义

我知道jQuery已加载,因为我可以切换$ 对于“jQuery”,所有操作都按预期进行,但如果我无法修复此问题,这将是一个混乱的脚本此脚本:jQuery(document).ready(function(){ $(\"ul.vimeo_desc_feed li a\").click(function(){ alert($(this).attr(\'href\')); return false; }) }); 产