Cree más Meta Boxes según sea necesario

46

Me gustaría que los usuarios puedan crear y eliminar campos adicionales de metacuadros 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.

Picard102
fuente
¡estás describiendo el metabox de campos personalizados incorporado!
Bainternet
1
Supongo que esencialmente así es como funciona, pero solo está configurado para hacer un campo a la vez, y no es muy amigable para el usuario final.
Picard102

Respuestas:

52

¿Te refieres a algo como esto?

ingrese la descripción de la imagen aquí

y cuando haces clic en Agregar pistas se convierte en esto:

ingrese la descripción de la imagen aquí

si es lo que quiere decir, se hace creando 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 meta fila, aquí tiene:

  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
fuente
Parece que solo muestra "array (0) {} Agregar pistas" cuando uso el código anterior.
Picard102
Sí, simplemente eliminevar_dump($songs);
Bainternet
Genial, eso solucionó eso, pero ahora los datos no parecen estar guardando en la actualización. O al menos no muestra los datos como campos en Mi seguimiento, ni en Campos personalizados. Si vuelvo a colocar var_dump aunque escupe "array (1) {[0] => array (1) {[1] => array (2) {[" title "] => string (4)" test "[" track "] => string (5)" teste "}}} Agregar pistas"
Picard102
44
No estoy realmente seguro de cuál es el problema, no es un código exacto, es un ejemplo y está funcionando bien por mi parte, intenta cambiar if (count($songs) > 0){aif(is_array($songs)){
Bainternet
3

Esto se hace a través de campos personalizados PERO nunca debe usar nada que permita a los usuarios agregar crear o eliminar meta cuadros. Estos escriben directamente en la base de datos, por lo que potencialmente podría crear muchos problemas para su sitio si brinda a los usuarios este tipo de control. Es mucho más seguro para usted crear la cantidad máxima de campos personalizados que puedan necesitar y dejarlos en blanco cuando no los necesite.

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

Algunas sugerencias:

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

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

Elpie
fuente
3
PERO nunca debe usar nada que permita a los usuarios agregar o eliminar meta cuadros ¿Por qué?
Travis Northcutt
Mi única preocupación es que con cualquier complemento, existe la posibilidad de que deje de ser compatible en el futuro. Siento que probablemente sea más probable que pueda descubrir cómo solucionar una simple adición al archivo de funciones, que averiguar cómo solucionar un complemento.
Picard102
Los complementos son esencialmente funciones que residen fuera del tema. Puede tomar un complemento y copiar el código en functions.php y funcionará. Del mismo modo, puede quitar funciones de functions.php, agregar el encabezado necesario para el complemento, y funciona igual tan pronto como lo active.
Elpie
Bueno saber. Probé los dos complementos que sugirió, pero ninguno de ellos me permitió realmente hacer lo que necesitaba que ya no podría hacer sin el complemento. Gracias por las sugerencias sin embargo.
Picard102