Taxonomie-Dropdown-Metabox im Backend

9

Ich habe eine benutzerdefinierte Taxonomie namens aufgerufen Brandsund sie hierarchisch gestaltet, damit ich dort Automarken und -modelle hinzufügen und ihre Beziehungen wie folgt beibehalten kann:

  • Ford
    • Mustang
    • Mondeo
    • Fokus

Das Problem ist, dass diese Liste möglicherweise ziemlich lang wird und nur eine Marke und ein Modell pro Beitrag benötigt werden, sodass Kontrollkästchen irreführend sind.

Ich denke darüber nach, diese Metabox in zwei Teile aufzuteilen (einen für die Marke und einen für das Modell) und sie zu Dropdowns zu machen. Wenn also die Marke in der ersten Dropdown-Liste ausgewählt wird, werden in der zweiten Dropdown-Liste nur Modelle angezeigt, die mit dieser Marke zusammenhängen. Aber ich habe keine Ahnung, wie ich es codieren soll. Vielleicht könnte mir jemand ein Beispiel zeigen?

Kovas
quelle

Antworten:

10

Hier ist ein Beispiel. Ich habe auch einen Gist mit allgemeinerem Code erstellt.

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
quelle
@Hameedullah ziemlich schweres Zeug Hameedullah, trotzdem tolle Arbeit. +1
VicePrez
@Hameedullah sehr nett. Aber ich habe ein Problem damit. Ich habe den gesamten Code in meine functions.php eingefügt und wenn ich zum Post-Backend gehe, erhalte ich Folgendes: Warnung: define () erwartet mindestens 2 Parameter, von denen 1 in angegeben ist (auf diese Codezeile zeigend :) if ( define('DOING_AUTOSAVE') && DOING_AUTOSAVE ).
Kovas
Bitte ändern Sie die Definition in definiert zBif ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ))
Hameedullah Khan
@Hameedullah das ist großartig, danke für die Lösung :)
Kovas
war aufgeregt, dieses Snippet zu finden und probierte es vor Ort aus. Ich verwende es für einen benutzerdefinierten Post-Typ, nicht für Posts, sehe aber die Metabox nicht. Sind Schritte erforderlich, damit dies bei anderen Post-Typen funktioniert? ..Ich habe den Steuernamen in meine benutzerdefinierte Taxonomie geändert und diese nur für eine einzelne Steuer verwendet, nicht für eine Mehrfachsteuer wie die ursprünglich angeforderte Person
Shawn