Créez plus de boîtes méta au besoin

46

J'aimerais que les utilisateurs soient en mesure de créer et de supprimer des champs de méta-boîtes supplémentaires selon les besoins.

Par exemple, disons un podcast musical avec une quantité variable de chansons jouées par épisode. L'utilisateur devrait pouvoir cliquer sur un bouton qui ajoutera des champs supplémentaires pour entrer chaque chanson selon les besoins.

Idéalement, cela se ferait sans l'utilisation d'un plugin, mais codé dans le fichier de fonctions.

Picard102
la source
vous décrivez la métabox des champs personnalisés intégrés!
Bainternet
1
En gros, je suppose que c'est comme ça que ça fonctionne, mais il est uniquement conçu pour un champ à la fois, et il n'est pas très convivial.
Picard102

Réponses:

52

Alors tu veux dire quelque chose comme ça?

entrez la description de l'image ici

et lorsque vous cliquez sur Ajouter des pistes, cela devient:

entrez la description de l'image ici

si c’est ce que vous voulez dire par sa création en créant un metabox qui a une simple fonction jquery pour ajouter et supprimer des champs, et les données sont sauvegardées sous forme de tableau dans une rangée de méta, voici ce que vous allez faire:

  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
la source
Il semble afficher uniquement "array (0) {} Add Tracks" lorsque j'utilise le code ci-dessus.
Picard102
Oui, il suffit de retirervar_dump($songs);
Bainternet
Cool, ça a réglé ça, mais maintenant les données ne semblent pas économiser sur la mise à jour. Ou du moins, cela n’affiche pas les données sous forme de champs dans My Track, ni dans Custom Fields. Si je remets le var_dump dedans alors qu'il crache "array (1) {[0] => array (1) {[1] => array (2) {[" title "] => string (4)" test "[" track "] => string (5)" teste "}}} Ajouter des pistes"
Picard102
4
Pas vraiment sûr du problème, ce n'est pas un code exact, c'est un exemple et ça marche très bien de mon côté, essayez de passer if (count($songs) > 0){àif(is_array($songs)){
Bainternet
3

Cela se fait via des champs personnalisés MAIS vous ne devez jamais utiliser quoi que ce soit qui permet aux utilisateurs d’ ajouter, de créer ou de supprimer des méta-boîtes. Ceux-ci écrivent directement dans la base de données afin que vous puissiez potentiellement créer beaucoup de problèmes pour votre site si vous accordez ce type de contrôle aux utilisateurs. Il est bien plus prudent de créer le nombre maximum de champs personnalisés dont ils peuvent avoir besoin et de les laisser en blanc lorsqu'ils ne sont pas nécessaires.

C'est aussi le territoire du plugin. Le fichier de fonctions est spécifique à un thème alors que les plug-ins sont destinés à des fonctions qui s'appliquent au contenu du site, en particulier si vous souhaitez que ce contenu soit disponible quel que soit le thème que vous utilisez.

Quelques suggestions:

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

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

Elpie
la source
3
MAIS vous ne devez jamais utiliser quoi que ce soit qui permet aux utilisateurs d’ajouter ou de supprimer des méta-boîtes Pourquoi?
Travis Northcutt
Mon seul souci est qu'avec n'importe quel plugin, il risque de ne plus être pris en charge à l'avenir. Je pense qu'il est probablement plus probable que je sois capable de comprendre comment corriger un simple ajout au fichier de fonctions plutôt que de savoir comment réparer un plugin.
Picard102
Les plugins sont essentiellement des fonctions qui résident en dehors du thème. Vous pouvez prendre un plugin et copier le code dans functions.php et cela fonctionnera. De même, vous pouvez supprimer des fonctions de functions.php, ajouter l'en-tête nécessaire pour le plug-in, et cela fonctionne de la même manière dès que vous l'activez.
Elpie
Bon à savoir. J'ai essayé les deux plugins que vous avez suggérés, mais aucun d'eux ne m'a laissé faire ce dont j'avais besoin, ce que je ne pouvais pas déjà faire sans le plugin. Merci pour les suggestions cependant.
Picard102