Metabox a discesa della tassonomia nel back-end


9

Ho creato una tassonomia personalizzata chiamata Brandse resa gerarchica in modo da poter aggiungere lì marchi e modelli di auto e mantenere le loro relazioni, in questo modo:

  • Guado
    • Mustang
    • Mondeo
    • Messa a fuoco

Il problema è che questo elenco potrebbe diventare piuttosto lungo e sono necessari solo un marchio e un modello per post, quindi le caselle di controllo sono fuorvianti.

Sto pensando di dividere quel metabox in due (uno per il marchio e uno per il modello) e farli cadere. Pertanto, quando viene selezionato il marchio nel primo menu a discesa, il secondo menu a discesa mostra solo i modelli correlati a quel marchio. Ma non ho idea di come codificarlo. Forse qualcuno potrebbe mostrarmi un esempio?

Risposte:


10

Ecco un esempio Ho anche creato un Gist con codice più generico.

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 roba piuttosto pesante, comunque ottimo lavoro. +1
VicePrez,

@Hameedullah molto bello. Ma ho un problema con questo. Ho incollato tutto questo codice nel mio function.php e quando vado al post back-end, ottengo questo: Attenzione: define () si aspetta almeno 2 parametri, 1 dato in (indicando questa riga di codice:) if ( define('DOING_AUTOSAVE') && DOING_AUTOSAVE ).
Kovas,

per favore cambia definisci come definito ad es.if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ))
Hameedullah Khan

@Hameedullah è fantastico, grazie per la soluzione :)
Kovas

era entusiasta di trovare questo frammento e di provarlo sul posto. Lo sto usando su un post-tipo personalizzato, non sui post, ma non vedo il metabox. ci sono dei passaggi necessari per far funzionare questo su altri post-tipi? ..Io ho cambiato il nome fiscale con la mia tassonomia personalizzata, usando solo questo per singola imposta, non multipla come la persona originale richiesta
shawn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.