Metabox dropdown taksonomi di back-end

9

Saya telah membuat taksonomi khusus yang disebut Brandsdan membuatnya hierarkis sehingga saya dapat menambahkan merek dan model Mobil di sana dan menjaga hubungan mereka, seperti ini:

  • Mengarungi
    • Mustang
    • Mondeo
    • Fokus

Masalahnya, daftar ini mungkin cukup panjang dan hanya satu merek dan satu model yang diperlukan per posting, sehingga kotak centangnya menyesatkan.

Saya berpikir untuk membagi metabox menjadi dua (satu untuk merek dan satu untuk model) dan membuatnya dropdown. Jadi ketika merek dipilih dalam dropdown pertama, dropdown kedua hanya akan menunjukkan model yang terkait dengan merek itu. Tetapi saya tidak tahu bagaimana kode itu. Mungkin ada yang bisa memberi saya contoh?

Kovas
sumber

Jawaban:

10

Berikut ini sebuah contoh. Saya juga telah membuat inti dengan kode yang lebih umum.

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 Khan
sumber
@Hameedullah hal-hal yang cukup berat hameedullah, pekerjaan yang hebat. +1
Wakil Presiden
@Hameedullah sangat bagus. Tapi saya punya masalah dengan itu. Saya menempelkan semua kode ini ke functions.php saya dan ketika saya pergi ke back-end post, saya mendapatkan ini: Peringatan: define () mengharapkan setidaknya 2 parameter, 1 diberikan (menunjuk ke baris kode ini:) if ( define('DOING_AUTOSAVE') && DOING_AUTOSAVE ).
Kovas
tolong ubah define ke yang didefinisikan misalnyaif ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ))
Hameedullah Khan
@Hameedullah ini hebat, terima kasih atas solusinya :)
Kovas
bersemangat menemukan cuplikan ini dan mencobanya di situs. Saya menggunakannya pada tipe posting khusus, bukan posting, tetapi tidak melihat metabox. apakah ada langkah-langkah yang diperlukan untuk membuat ini bekerja pada tipe post lainnya? ..Aku mengubah nama pajak menjadi taksonomi khusus saya, hanya menggunakan ini untuk pajak tunggal, tidak multi seperti yang diminta orang asli
shawn