Arka uçta sınıflandırma açılır meta kutusu


9

BrandsAraba markalarını ve modellerini oraya ekleyebilir ve ilişkilerini şu şekilde tutabilirim: adlandırılan özel bir sınıflandırma oluşturdum ve hiyerarşik yaptım:

  • Ford
    • yabani at
    • Mondeo
    • odak

Sorun şu ki, bu liste oldukça uzayabilir ve her gönderi için yalnızca bir marka ve bir modele ihtiyaç vardır, bu nedenle onay kutuları yanıltıcıdır.

Bu meta kutusunu ikiye bölmeyi düşünüyorum (biri marka için ve diğeri model için) ve açılır menüler yapıyorum. Dolayısıyla, ilk açılır menüde marka seçildiğinde, ikinci açılır menü yalnızca o markayla ilgili modelleri gösterir. Ama nasıl kodlanacağı hakkında hiçbir fikrim yok. Belki birisi bana bir örnek gösterebilir?

Yanıtlar:


10

İşte bir örnek. Ayrıca daha genel kod ile bir Gist oluşturduk .

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 oldukça ağır şeyler hameedullah, yine de büyük iş. +1
VicePrez

@ Gayedullah çok güzel. Ama bununla ilgili bir sorunum var. Tüm bu kodu benim işlevlerime yapıştırdım. Php ve sonrası arka uca gittiğinizde, bunu elde: Uyarı: define () 1 (bu kod satırına işaret:) verilen en az 2 parametre beklerif ( define('DOING_AUTOSAVE') && DOING_AUTOSAVE ) .
Kovas

lütfen tanımını tanımlı olarak değiştirin örn.if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ))
Hameedullah Han

@Hameedullah bu harika, çözüm için teşekkürler :)
Kovas 29:11

bu snippet'i bulmak için heyecanlandı ve sitede denedi. Mesajları değil, özel bir yazı türü üzerinde kullanıyorum, ancak meta kutusunu görmüyorum. bunun diğer yazı türlerinde çalışması için gerekli adımlar var mı? ..Vergi adını özel taksonomim olarak değiştirdim, sadece tek bir vergi için kullanıyorum, talep edilen orijinal kişi gibi çok değil
shawn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.