Taxonomy dropdown metabox ในแบ็คเอนด์


9

ฉันได้สร้าง taxonomy แบบกำหนดเองที่เรียกว่าBrandsและทำให้เป็นลำดับชั้นเพื่อให้ฉันสามารถเพิ่มยี่ห้อและรุ่นของรถยนต์ที่นั่นและรักษาความสัมพันธ์ของพวกเขาเช่นนี้:

  • ลุย
    • ม้าป่า
    • Mondeo
    • โฟกัส

ปัญหาคือรายการนี้อาจยาวมากและมีเพียงแบรนด์เดียวและรุ่นเดียวต่อการโพสต์ดังนั้นช่องทำเครื่องหมายจะทำให้เข้าใจผิด

ฉันคิดว่าจะแยกเมท๊อกซ์ออกเป็นสองส่วน (หนึ่งสำหรับยี่ห้อและอีกอันสำหรับแบบจำลอง) และทำให้เป็นแบบเลื่อนลง ดังนั้นเมื่อแบรนด์ถูกเลือกในดรอปดาวน์แรกดรอปดาวน์ที่สองจะแสดงเฉพาะรุ่นที่เกี่ยวข้องกับแบรนด์นั้น แต่ฉันไม่รู้ว่าจะใช้รหัสอย่างไร อาจมีใครสามารถแสดงตัวอย่างให้ฉันดูบ้าง

คำตอบ:


10

นี่คือตัวอย่าง ฉันได้สร้างGistด้วยรหัสทั่วไปมากขึ้น

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 สิ่งที่ค่อนข้างหนัก hameedullah งานที่ดีอย่างไรก็ตาม +1
VicePrez

@Hameedullah ดีมาก แต่ฉันมีปัญหากับมัน ฉันวางทุกรหัสนี้เพื่อ functions.php ฉันและเมื่อฉันไปที่โพสต์กลับปลายผมได้รับนี้: คำเตือน: define () คาดว่าอย่างน้อย 2 พารามิเตอร์ที่กำหนดใน 1 (ชี้ไปที่บรรทัดของรหัสนี้: if ( define('DOING_AUTOSAVE') && DOING_AUTOSAVE ))
Kovas

โปรดเปลี่ยนการกำหนดเป็นคำนิยามเช่นif ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ))
Hameedullah Khan

@Hameedullah นี้เป็นที่ดีขอบคุณสำหรับการแก้ปัญหา :)
Kovas

รู้สึกตื่นเต้นที่ได้พบข้อมูลโค้ดนี้และทดลองใช้ในไซต์ ฉันใช้มันกับโพสต์ประเภทที่กำหนดเองไม่ใช่โพสต์ แต่ไม่เห็นเมท็อกซ์ จำเป็นต้องมีขั้นตอนใดบ้างเพื่อให้สามารถใช้งานโพสต์ประเภทอื่นได้ .. ฉันเปลี่ยนชื่อภาษีเป็น taxonomy ที่กำหนดเองของฉันเพียงแค่ใช้สิ่งนี้สำหรับภาษีเดียวไม่ใช่หลายอย่างที่บุคคลดั้งเดิมร้องขอ
shawn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.