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

44

Je souhaite que les utilisateurs puissent créer et supprimer d'autres champs de la boîte à méta, si nécessaire.

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.

    
posée Picard102 13.06.2011 - 01:22

2 réponses

52

Vous voulez dire quelque chose comme ça?

etlorsquevouscliquezsurAjouterdespistes,celadevient:

si c’est ce que vous voulez dire par sa création en créant un metabox doté d’une simple fonction jquery pour y ajouter et supprimer des champs, et que les données soient enregistrées en tant que tableau dans une méta-ligne, procédez comme suit:

  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);
    }
    
réponse donnée Bainternet 13.06.2011 - 09:41
3

Ceci est effectué via des champs personnalisés MAIS vous ne devez jamais utiliser quoi que ce soit qui permette aux utilisateurs add 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 maximal de champs personnalisés dont ils peuvent avoir besoin et de les laisser en blanc lorsqu'ils ne sont pas nécessaires.

Ceci est également le territoire du plugin. Le fichier de fonctions est spécifique à un thème, tandis que les plugins sont destinés aux 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:

enlace

enlace

    
réponse donnée Elpie 13.06.2011 - 02:20

Lire d'autres questions sur les étiquettes