बैक-एंड में टैक्सोनॉमी ड्रॉपडाउन मेटाबॉक्स


9

मैंने कस्टम टैक्सोनॉमी का निर्माण किया है 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();
}

@ हमीदुल्लाह बहुत भारी सामान हमीदुल्लाह, फिर भी महान काम। +1
वाइसप्रेज़

@ हमीदुल्लाह बहुत अच्छा। लेकिन मुझे इससे समस्या है। मैंने यह सभी कोड अपने फ़ंक्शन के लिए पेस्ट कर दिए हैं। एफपी और जब मैं पोस्ट-बैक-एंड पर जाता हूं, तो मुझे यह मिलता है: चेतावनी: परिभाषित () कम से कम 2 मापदंडों की अपेक्षा करता है, 1 में दिया गया (कोड की इस पंक्ति की ओर इशारा करते हुए:) if ( define('DOING_AUTOSAVE') && DOING_AUTOSAVE )
कोवस

कृपया परिभाषित परिभाषित करने के लिए परिवर्तन बदलेंif ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ))
हमीदुल्ला खान

@ हमीदुल्लाह यह महान है, समाधान के लिए धन्यवाद :)
कोवास

इस स्निपेट को खोजने के लिए उत्साहित था और इसे साइट पर आजमाया। मैं एक कस्टम पोस्ट-प्रकार पर उपयोग कर रहा हूं, पोस्ट नहीं, लेकिन मेटाबॉक्स नहीं देखता। अन्य प्रकारों पर इस कार्य को करने के लिए आवश्यक कदम हैं? ..मैंने अपने कस्टम टैक्सोनॉमी में कर नाम बदल दिया, केवल एकल कर के लिए इसका उपयोग किया, मूल व्यक्ति की तरह बहु का अनुरोध नहीं किया
शॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.