私はCPT(カスタム投稿タイプの略) "bagp_deals"とカスタム分類法 "ba_locations"と "ba_cats"を基本とするサイトを持っています。デフォルトの編集画面で、選択範囲をそれぞれ1つ(1つの場所と1つのカテゴリ)に限定したいのですが、JQueryを使用してそれを行おうとしています[] "これまでのところ、私はこのコードを持っています:
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);
}
});
魔女はチェックボックスの選択を1つに制限することになっています。どういうわけか私はこれを働かせることができません。
質問
問題は、なぜこれが機能しないのかということです。それとも、選択を1つだけに制限するためのより良い解決策がありますか?
任意の助けは大歓迎です。
これは私が使用した作業コードです:
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);
}
});
JQueryでハッキングする代わりに、より信頼性の高い解決策は、PHPでメタボックスを自分のものに置き換えることです。
とにかく、問題はセレクタの中の '['と ']'文字にある可能性が最も高いです。
"input[name=tax_input[ba_locations][]]"
ように書き直すことができる
"input[name=tax_input\\[ba_locations\\]\\[\\]]"
私はあなたのための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";
}
}
これは私が私の関数に投げたものですが、私は期待される結果を得ているようには思えません。
<?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 } ?>
あなたがこれに対する解決策を見つけたかどうかわからないが、私は同じことをする必要がありました。私はあなたの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);
}
});
私の分類法の入力はlocationと呼ばれ、ba_locationsではありませんでした。
@sviryatko の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;
}
);