webentwicklung-frage-antwort-db.com.de

Erstellen Sie nach Bedarf weitere Meta-Boxen

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

Nehmen wir zum Beispiel einen Musik-Podcast mit einer variablen Anzahl von Songs pro Episode an. 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, jedoch in der Funktionsdatei codiert.

45
Picard102

Also meinst du so etwas?

enter image description here

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

enter image description here

wenn es das ist, was Sie damit meinen, dass 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, 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);
    }
53
Bainternet

Dies geschieht über benutzerdefinierte Felder, ABER Sie sollten niemals etwas verwenden, das Benutzern erlaubt hinzufügen Erstellen oder Entfernen von Meta-Boxen. 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 viel sicherer für Sie, 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 bestimmt sind, die für den Site-Inhalt gelten, insbesondere, wenn dieser Inhalt unabhängig vom verwendeten Thema verfügbar sein soll.

Einige Vorschläge:

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

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

3
Elpie