Metabox thả xuống phân loại trong back-end


9

Tôi đã tạo ra phân loại tùy chỉnh được gọi Brandsvà làm cho nó được phân cấp để tôi có thể thêm các thương hiệu và mô hình Xe hơi ở đó và giữ mối quan hệ của họ, như thế này:

  • Ford
    • Mustang
    • Thứ hai
    • Tiêu điểm

Vấn đề là, danh sách này có thể trở nên khá dài và chỉ cần một thương hiệu và một mô hình cho mỗi bài đăng, vì vậy các hộp kiểm là sai lệch.

Tôi đang suy nghĩ để chia metabox thành hai (một cho thương hiệu và một cho người mẫu) và làm cho chúng rơi xuống. Vì vậy, khi thương hiệu được chọn trong danh sách thả xuống đầu tiên, danh sách thả xuống thứ hai sẽ chỉ hiển thị các mô hình liên quan đến thương hiệu đó. Nhưng tôi không biết làm thế nào để mã hóa nó. Có lẽ ai cũng có thể chỉ cho tôi một ví dụ?

Câu trả lời:


10

Đây là một ví dụ. Tôi cũng đã tạo ra một Gist với mã chung hơn.

add_action('add_meta_boxes', 'my_custom_metabox');
function my_custom_metabox() {
    add_meta_box('custom-taxonomy-dropdown','Brands','taxonomy_dropdowns_box','post','side','high');
}

function taxonomy_dropdowns_box( $post ) {
    wp_nonce_field('custom-dropdown', 'dropdown-nonce');
    $terms = get_terms( 'brands', 'hide_empty=0');
    $object_terms = wp_get_object_terms( $post->ID, 'brands', array('fields'=>'ids'));

    // you can move the below java script to admin_head
?>
    <script type="text/javascript">
        jQuery(document).ready(function() {
                jQuery('#custombrandoptions').change(function() {
                    var custombrand = jQuery('#custombrandoptions').val();
                    if ( custombrand == '0') {
                        jQuery('#custommodeloptions').html('');
                            jQuery('#modelcontainer').css('display', 'none');
                    } else {
                        var data = {
                            'action':'get_brand_models',
                            'custombrand':custombrand,
                            'dropdown-nonce': jQuery('#dropdown-nonce').val()
                        };
                        jQuery.post(ajaxurl, data, function(response){
                            jQuery('#custommodeloptions').html(response);
                            jQuery('#modelcontainer').css('display', 'inline');
                        });
                    }
                });
        });
    </script>
    <?php
    echo "Brand:";
    echo "<select id='custombrandoptions' name='custombrands[]'>";
    echo "<option value='0'>None</option>";
    foreach ( $terms as $term ) {
        if ( $term->parent == 0) {
            if ( in_array($term->term_id, $object_terms) ) {
                $parent_id = $term->term_id;
                echo "<option value='{$term->term_id}' selected='selected'>{$term->name}</option>";
            } else {
                echo "<option value='{$term->term_id}'>{$term->name}</option>";
            }
        }
    }
    echo "</select><br />";
    echo "<div id='modelcontainer'";
    if ( !isset( $parent_id)) echo " style='display: none;'";
    echo ">";
    echo "Models:";
    echo "<select id='custommodeloptions' name='custombrands[]'>";
    if ( isset( $parent_id)) {
        $models = get_terms( 'brands', 'hide_empty=0&child_of='.$parent_id);
        foreach ( $models as $model ) {
             if ( in_array($model->term_id, $object_terms) ) {
                echo "<option value='{$model->term_id}' selected='selected'>{$model->name}</option>";
            } else {
                echo "<option value='{$model->term_id}'>{$model->name}</option>";
            }
        }
    }
    echo "</select>";
    echo "</div>";
}

add_action('save_post','save_my_custom_taxonomy');
function save_my_custom_taxonomy( $post_id ) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        return;

    if ( !wp_verify_nonce($_POST['dropdown-nonce'], 'custom-dropdown'))
        return;

    $brands = array_map('intval', $_POST['custombrands']);
    wp_set_object_terms($post_id, $brands, 'brands');
}

add_action('wp_ajax_get_brand_models', 'get_brand_models');
function get_brand_models() {
    check_ajax_referer('custom-dropdown', 'dropdown-nonce');
    if (isset($_POST['custombrand'])) {
        $models = get_terms( 'brands', 'hide_empty=0&child_of='. $_POST['custombrand']);
        echo "<option value='0'>Select one</option>";
        foreach ($models as $model) {
            echo "<option value='{$model->term_id}'>{$model->name}</option>";
        }
    }
    die();
}

@Hameedullah công cụ khá nặng hameedullah, dù sao thì công việc tuyệt vời. +1
VicePrez

@Hameedullah rất hay. Nhưng tôi có một vấn đề với nó. Tôi đã dán tất cả mã này vào hàm.php của mình và khi tôi đi đến phần hậu kỳ, tôi nhận được điều này: Cảnh báo: định nghĩa () mong đợi ít nhất 2 tham số, 1 tham số (chỉ vào dòng mã này if ( define('DOING_AUTOSAVE') && DOING_AUTOSAVE ):).
Kovas

vui lòng thay đổi định nghĩa thành được xác định, ví dụ:if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ))
Hameedullah Khan

@Hameedullah điều này thật tuyệt, cảm ơn vì giải pháp :)
Kovas

đã rất hào hứng khi tìm thấy đoạn trích này và đã thử nó trên trang web. Tôi đang sử dụng nó trên một loại bài tùy chỉnh, không phải bài viết, nhưng không thấy metabox. Có các bước cần thiết để thực hiện công việc này trên các loại bài khác không? ..Tôi đã làm thay đổi tên thuế để phân loại tùy chỉnh của tôi, chỉ sử dụng này cho thuế duy nhất, không nhiều như người gốc yêu cầu
shawn
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.