Crie mais caixas meta, conforme necessário

46

Gostaria que os usuários pudessem criar e remover campos adicionais de metabox, conforme necessário.

Por exemplo, diga um podcast de música com uma quantidade variável de músicas reproduzidas por episódio. O usuário deve poder clicar em um botão que adicionará campos adicionais para inserir cada música, conforme necessário.

Idealmente, isso seria feito sem o uso de um plug-in, mas codificado no arquivo de funções.

Picard102
fonte
você está descrevendo os campos personalizados internos metabox!
Bainternet
1
Eu acho que basicamente é assim que funciona, mas é configurado apenas para fazer um campo de cada vez, e não é muito amigável ao usuário final.
Picard102

Respostas:

52

Então você quer dizer algo assim?

insira a descrição da imagem aqui

e quando você clica em Adicionar faixas, fica assim:

insira a descrição da imagem aqui

se é isso que você quer dizer com o feito, criando uma metabox que possui uma função simples de jquery para adicionar e remover campos, e os dados são salvos como uma matriz de dados em uma única meta-linha, aqui está:

  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
fonte
Parece exibir apenas "array (0) {} Add Tracks" quando eu uso o código acima.
Picard102
Sim apenas removervar_dump($songs);
Bainternet
Legal, isso corrigiu isso, mas agora os dados não parecem estar salvos na atualização. Ou, pelo menos, não está mostrando os dados como campos em Minha faixa, nem em Campos personalizados. Se eu colocar o var_dump de volta, apesar de cuspir "teste de array (1) {[0] => array (1) {[1] => array (2) {[" title "] => string (4)" "[" track "] => string (5)" teste "}}} Adicionar faixas"
Picard102 15/06/11
4
Realmente não sei o que é o problema, não é um código exato, o seu exemplo e sua multa trabalhando no meu fim, tente mudar if (count($songs) > 0){paraif(is_array($songs)){
Bainternet
3

Isso é feito através dos campos personalizados, MAS você nunca deve usar nada que permita aos usuários adicionar ou criar meta boxes. Eles são gravados diretamente no banco de dados para que você possa criar muitos problemas para o seu site se der esse controle aos usuários. É muito mais seguro criar o número máximo de campos personalizados de que eles podem precisar e deixá-los em branco onde não são necessários.

Este também é território de plugins. O arquivo de funções é específico do tema, enquanto os plug-ins são para funções que se aplicam ao conteúdo do site, especialmente se você deseja que esse conteúdo esteja disponível, independentemente do tema usado.

Algumas sugestões:

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

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

Elpie
fonte
3
MAS você nunca deve usar nada que permita aos usuários adicionar ou remover meta boxes Por que?
Travis Northcutt
Minha única preocupação é que, com qualquer plugin, chegue a chance de ele deixar de ser suportado no futuro. Eu sinto que provavelmente é mais provável que eu consiga descobrir como corrigir uma adição simples ao arquivo de funções do que descobrir como consertar um plugin.
Picard102
Plugins são essencialmente funções que residem fora do tema. Você pode pegar um plugin e copiar o código em functions.php e ele funcionará. Da mesma forma, você pode tirar funções do functions.php, adicionar o cabeçalho necessário para o plug-in e ele funciona da mesma maneira assim que você o ativa.
Elpie
Bom saber. Eu tentei os dois plugins que você sugeriu, mas nenhum deles me deixou realmente fazer o que eu precisava e que já não podia fazer sem o plug-in. Obrigado pelas sugestões embora.
Picard102