Erstellen Sie nach Bedarf weitere Meta-Boxen

46

Ich möchte, dass Benutzer nach Bedarf zusätzliche Meta-Box-Felder erstellen und entfernen können.

Sagen wir zum Beispiel einen Musik-Podcast mit einer variablen Anzahl von Songs, die pro Episode abgespielt werden. Der Benutzer sollte in der Lage sein, auf eine Schaltfläche zu klicken, die zusätzliche Felder hinzufügt, um jedes Lied nach Bedarf einzugeben.

Im Idealfall würde dies ohne die Verwendung eines Plugins geschehen, das jedoch in der Funktionsdatei codiert ist.

Picard102
quelle
Sie beschreiben die eingebaute Metabox für benutzerdefinierte Felder!
Bainternet
1
Ich schätze, im Grunde funktioniert das so, aber es ist nur für jeweils ein Feld eingerichtet und nicht sehr benutzerfreundlich.
Picard102

Antworten:

52

Also meinst du so etwas?

Bildbeschreibung hier eingeben

und wenn du auf Add tracks klickst, wird es so:

Bildbeschreibung hier eingeben

Wenn es das ist, was Sie meinen, indem Sie eine Metabox erstellen, die über eine einfache Abfragefunktion zum Hinzufügen und Entfernen von Feldern verfügt, und die Daten als Array von Daten in einer einzelnen Metazeile gespeichert werden, dann gehen Sie wie folgt vor:

  add_action( 'add_meta_boxes', 'dynamic_add_custom_box' );

    /* Do something with the data entered */
    add_action( 'save_post', 'dynamic_save_postdata' );

    /* Adds a box to the main column on the Post and Page edit screens */
    function dynamic_add_custom_box() {
        add_meta_box(
            'dynamic_sectionid',
            __( 'My Tracks', 'myplugin_textdomain' ),
            'dynamic_inner_custom_box',
            'post');
    }

    /* Prints the box content */
    function dynamic_inner_custom_box() {
        global $post;
        // Use nonce for verification
        wp_nonce_field( plugin_basename( __FILE__ ), 'dynamicMeta_noncename' );
        ?>
        <div id="meta_inner">
        <?php

        //get the saved meta as an array
        $songs = get_post_meta($post->ID,'songs',false);

        $c = 0;
        if ( count( $songs ) > 0 ) {
            foreach( $songs as $track ) {
                if ( isset( $track['title'] ) || isset( $track['track'] ) ) {
                    printf( '<p>Song Title <input type="text" name="songs[%1$s][title]" value="%2$s" /> -- Track number : <input type="text" name="songs[%1$s][track]" value="%3$s" /><span class="remove">%4$s</span></p>', $c, $track['title'], $track['track'], __( 'Remove Track' ) );
                    $c = $c +1;
                }
            }
        }

        ?>
    <span id="here"></span>
    <span class="add"><?php _e('Add Tracks'); ?></span>
    <script>
        var $ =jQuery.noConflict();
        $(document).ready(function() {
            var count = <?php echo $c; ?>;
            $(".add").click(function() {
                count = count + 1;

                $('#here').append('<p> Song Title <input type="text" name="songs['+count+'][title]" value="" /> -- Track number : <input type="text" name="songs['+count+'][track]" value="" /><span class="remove">Remove Track</span></p>' );
                return false;
            });
// The live() method was deprecated in jQuery version 1.7, and removed in version 1.9. Use the on() method instead. We can use .on
            $(".remove").live('click', function() {
                $(this).parent().remove();
            });
        });
        </script>
    </div><?php

    }

    /* When the post is saved, saves our custom data */
    function dynamic_save_postdata( $post_id ) {
        // verify if this is an auto save routine. 
        // If it is our form has not been submitted, so we dont want to do anything
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
            return;

        // verify this came from the our screen and with proper authorization,
        // because save_post can be triggered at other times
        if ( !isset( $_POST['dynamicMeta_noncename'] ) )
            return;

        if ( !wp_verify_nonce( $_POST['dynamicMeta_noncename'], plugin_basename( __FILE__ ) ) )
            return;

        // OK, we're authenticated: we need to find and save the data

        $songs = $_POST['songs'];

        update_post_meta($post_id,'songs',$songs);
    }
Bainternet
quelle
Es scheint nur "array (0) {} Add Tracks" anzuzeigen, wenn ich den obigen Code verwende.
Picard102
Ja, einfach entfernenvar_dump($songs);
Bainternet
Cool, das hat das behoben, aber jetzt scheinen die Daten beim Update nicht mehr zu retten. Zumindest werden die Daten nicht als Felder unter "Meine Spur" oder "Benutzerdefinierte Felder" angezeigt. Wenn ich den var_dump wieder einsetze, obwohl er ausspuckt, wird "array (1) {[0] => array (1) {[1] => array (2) {[" title "] => string (4)" getestet "[" track "] => string (5)" teste "}}} Tracks
hinzufügen
4
Ich bin mir nicht sicher, was das Problem ist, es ist kein genauer Code, es ist ein Beispiel und es funktioniert if (count($songs) > 0){if(is_array($songs)){
einwandfrei.
3

Dies erfolgt über benutzerdefinierte Felder, ABER Sie sollten niemals Elemente verwenden, mit denen Benutzer Meta-Boxen hinzufügen oder entfernen können. Diese werden direkt in die Datenbank geschrieben, sodass Sie möglicherweise eine ganze Reihe von Problemen für Ihre Site verursachen können, wenn Sie den Benutzern diese Art der Kontrolle geben. Es ist für Sie weitaus sicherer, die maximale Anzahl von benutzerdefinierten Feldern zu erstellen, die sie möglicherweise benötigen, und einige Felder leer zu lassen, wenn sie nicht benötigt werden.

Dies ist auch Plugin-Gebiet. Die Funktionsdatei ist themenspezifisch, während Plug-ins für Funktionen gelten, die für den Websiteinhalt gelten, insbesondere, wenn dieser Inhalt verfügbar sein soll, unabhängig davon, welches Thema Sie verwenden.

Einige Vorschläge:

http://wordpress.org/extend/plugins/verve-meta-boxes/

http://wordpress.org/extend/plugins/more-fields/

Elpie
quelle
3
ABER Sie sollten niemals etwas verwenden, mit dem Benutzer Meta-Boxen hinzufügen oder entfernen können. Warum?
Travis Northcutt
Ich mache mir nur Sorgen, dass mit jedem Plugin die Möglichkeit einhergeht, dass es in Zukunft nicht mehr unterstützt wird. Ich bin der Meinung, dass es wahrscheinlich wahrscheinlicher ist, dass ich herausfinden kann, wie ein einfacher Zusatz zur Funktionsdatei repariert wird, als wie ein Plugin repariert wird.
Picard102
Plugins sind im Wesentlichen Funktionen, die sich außerhalb des Themas befinden. Du kannst ein Plugin nehmen und den Code in die Datei functions.php kopieren und es wird funktionieren. Ebenso können Sie functions.php mit Funktionen versehen, den erforderlichen Header für das Plugin hinzufügen und es funktioniert genauso, sobald Sie es aktivieren.
Elpie
Gut zu wissen. Ich habe die beiden von Ihnen vorgeschlagenen Plugins ausprobiert, aber keiner von beiden hat mich wirklich das tun lassen, was ich brauchte, was ich ohne das Plugin nicht schon hätte tun können. Vielen Dank für die Vorschläge.
Picard102,