giới hạn lựa chọn các nguyên tắc phân loại tùy chỉnh cho một?


7

Tôi có một trang web với CPT (viết tắt của loại bài đăng tùy chỉnh) "bagp_deals" và các phân loại tùy chỉnh "ba_locations" và "ba_cats" về cơ bản là loại "Thỏa thuận" với "Vị trí" và "Danh mục" dưới dạng phân loại phân cấp. Trên màn hình chỉnh sửa mặc định, tôi muốn giới hạn lựa chọn chỉ một trong mỗi (một vị trí và một danh mục) và tôi đang cố gắng thực hiện điều đó với JQuery, tôi nhận thấy rằng phân loại tùy chỉnh trường của ba_locations được đặt tên là "tax_input [ba_locations] [] "và cho đến nay tôi có mã này:

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);
    }
});

phù thủy được cho là giới hạn lựa chọn hộp kiểm là một. Vì một số lý do tôi không thể làm việc này.

Câu hỏi

Vì vậy, câu hỏi là tại sao điều này không làm việc? hoặc bạn có một giải pháp tốt hơn để giới hạn lựa chọn chỉ là một?

bất kỳ trợ giúp được đánh giá cao.

cập nhật:

đây là mã làm việc tôi đã sử dụng:

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);
    }
});

Có lẽ bạn đang muốn làm một cái gì đó tương tự như những gì đã được thực hiện ở đây: wordpress.org/support/topic/,
t31os

Tôi đã tìm ra nó, nhưng cảm ơn.
Bai Internet

Câu trả lời:


6

Thay vì hack nó bằng jQuery, một giải pháp đáng tin cậy hơn sẽ là thay thế hộp meta bằng PHP của riêng bạn.

Dù sao, vấn đề rất có thể xảy ra với các ký tự '[' và ']' trong bộ chọn:

"input[name=tax_input[ba_locations][]]"

có thể được viết lại như

"input[name=tax_input\\[ba_locations\\]\\[\\]]"

Xem /programming/2786538/need-to-escape-a-special-character-in-a-jquery-selector- chuỗi


Cảm ơn nhưng không phải vậy 'tôi đã thử nó rồi. nhưng tôi đoán tôi không có lựa chọn nào khác sau đó thay thế hộp meta bằng cái riêng của tôi.
BaiNET

8

tôi có một giải pháp php cho bạn:

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";
    }
}

Cảm ơn các bạn tốt bụng! Vấn đề duy nhất tôi thấy với điều này là nó vẫn cho phép người dùng chọn nhiều danh mục trong "Phổ biến nhất". Dù sao để mở rộng điều này đến đó?
JacobTheDev

thay đổi cuộc gọi lại metabox cho "post_c chuyên_meta_box", sao chép chức năng này kết thúc cuộc gọi thay đổi của "wp_p Phổ_terms_checklist" vào bản sao của chức năng này khi bạn thay đổi hộp kiểm loại sang radio.
zviryatko

1

Không chắc chắn nếu bạn từng tìm thấy một giải pháp cho điều này, nhưng tôi cần phải làm điều tương tự. Tôi lấy jQuery của bạn và thêm trích dẫn cho tên + thoát chúng. Có vẻ như hoạt động tốt với tôi, vì vậy cảm ơn jQuery gốc :)

    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);
        }
    });

Đầu vào phân loại của tôi được gọi là vị trí và không phải ba_locations.


1

Đây là những gì tôi đã ném trong các chức năng của mình, nhưng dường như tôi không nhận được kết quả như mong đợi.

<?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 } ?>

0

Một phiên bản đơn giản hóa của giải pháp PHP của @sviryatko :

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;
    }
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.