Crear más Meta Boxes según sea necesario

44

Me gustaría que los usuarios puedan crear y eliminar campos de meta box adicionales según sea necesario.

Por ejemplo, digamos un podcast de música con una cantidad variable de canciones reproducidas por episodio. El usuario debe poder hacer clic en un botón que agregará campos adicionales para ingresar cada canción según sea necesario.

Idealmente, esto se haría sin el uso de un complemento, pero codificado en el archivo de funciones.

    
pregunta Picard102 13.06.2011 - 01:22

2 respuestas

52

¿Quieres decir algo como esto?

yalhacerclicenAgregarpistas,seconvierteenesto:

si es lo que quieres decir con su creación al crear un metabox que tiene una función jQuery simple para agregar y eliminar campos, y los datos se guardan como una matriz de datos en una sola fila de metadatos, aquí tienes:

  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);
    }
    
respondido por el Bainternet 13.06.2011 - 09:41
3

Esto se hace a través de campos personalizados PERO nunca debes usar nada que permita a los usuarios agregar crear o eliminar meta box. Estos se escriben directamente en la base de datos, por lo que potencialmente podría crear muchos problemas para su sitio si otorga a los usuarios este tipo de control. Es mucho más seguro para usted crear el número máximo de campos personalizados que pueden necesitar y dejarlos en blanco donde no sean necesarios.

Esto también es territorio de complementos. El archivo de funciones es específico del tema, mientras que los complementos son para las funciones que se aplican al contenido del sitio, especialmente si desea que el contenido esté disponible independientemente del tema que utilice.

Algunas sugerencias:

enlace

enlace

    
respondido por el Elpie 13.06.2011 - 02:20

Lea otras preguntas en las etiquetas