web-dev-qa-db-fra.com

Afficher le type de publication personnalisé à partir du champ personnalisé dynamique

J'essaie de créer une méta-boîte personnalisée qui vous permet d'ajouter des lignes de manière dynamique. L'extrait de code suivant fonctionne correctement et enregistre les données dans ma section de page d'édition. Cependant, je ne parviens pas à afficher les données sur la page réelle:

    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',
    'page');
    }

    /* 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 arry
$songs = get_post_meta($post->ID,'songs',true);

$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;
    });
    $(".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);
    }

Comme vous pouvez le constater, "page" fait référence à la page sur laquelle je souhaite poster. Maintenant, lorsque je boucle pour les résultats sur le modèle de page, rien ne s'affiche.

     <?php            
        $args = array(
'post_type' => 'page',   
    );  
    $repeat_loop = new WP_Query( $args ); if ( $repeat_loop->have_posts() ) : while ( $repeat_loop->have_posts() ) : $repeat_loop->the_post();
    $meta = get_post_meta( $post->ID, 'songs', true ); ?>                  
    <?php echo $meta['title']; ?><?php echo $meta['track']; ?>
         <?php endwhile; 
             endif;
                wp_reset_postdata(); 
            ?>

J'obtiens des résultats lorsque j'utilise 'var_dump ($ posts);'. Je n'arrive tout simplement pas à l'afficher dans la page.

1
user3645783

Essayez de changer $meta['title'] en $meta['title'][0] et la même chose pour $meta['track']. changez-le en $meta['track'][0]

METTRE À JOUR:

J'ai examiné le code plus en profondeur et vous avez essentiellement besoin d'une boucle foreach. Voici le code final devrait ressembler à ceci:

<?php
$args = array(
    'post_type' => 'page'
);  
$repeat_loop = new WP_Query( $args ); if ( $repeat_loop->have_posts() ) : while ( $repeat_loop->have_posts() ) : $repeat_loop->the_post();
$meta = get_post_meta( $post->ID, 'songs', true ); ?>                  

<?php
foreach ($meta as $key => $value) {
    echo $value['title']; ?><?php echo $value['track'];
}
?>
<?php endwhile; 
    endif;
    wp_reset_postdata(); 
?>

Merci

1
Abdul Awal

Ok, je l'ai résolu grâce à l'allusion de Abdul! J'ai besoin de parcourir mon tableau pour implémenter une simple boucle for:

    <?php for( $i= 0 ; $i <= 10 ; $i++ ) echo '<p>' .$meta[$i]['title']. '</p>';?>

Merci beaucoup pour l'aide!

0
user3645783