wake-up-neo.net

Benutzerdefinierte Meta-Boxen: Speichern Sie zwei Werte in einem wiederholbaren Feld

Ich versuche, eine benutzerdefinierte Meta-Box zu erstellen, in der der Benutzer nach Bedarf Felder hinzufügen kann. Ich habe dieses Tutorial befolgt: http://wp.tutsplus.com/tutorials/reusable-custom-meta-boxes-part-1-intro-and-basic-fields/

Ich möchte dieses Tutorial erweitern und ein wiederholbares Feld erstellen, das zwei Eingaben ermöglicht. Zum Beispiel: Name und URL.

Wie könnte ich das erreichen?

Ich fand diese andere Frage hier: Weitere Meta-Boxen nach Bedarf erstellen

Ich konnte das Meta-Box-Beispiel in meinen benutzerdefinierten Beitragstyp integrieren, aber ich konnte nicht herausfinden, wie die Meta-Werte in meinem Thema ausgegeben werden. Hier der Code, mit dem ich arbeite:

    /*---------------------------*/
    /* Define Metabox Fields
    /*---------------------------*/

    $prefix = 'tz_';

    $custom_downloads = array(
         'id' => 'custom-downloads',
         'title' => __('Custom Downloads Downloads (Beta)'),
         'page' => 'categories-supported',
         'context' => 'normal',
         'priority' => 'high',
         'fields' => array(

        array(
            'name' => __('Add Product Downloads', 'framework'),
            'desc' => __('This meta box is under development', 'framework'),
            'id' => $prefix . 'custom-downloads',
            'type' => 'text',
            'std' => ''
        ),                        
      )
    );

    /*-------------------------------------*/
    /* Add Meta Box to CPT screen 
    /*-------------------------------------*/

    function tz_add_box() {
        global $custom_downloads;

        add_meta_box($custom_downloads['id'], $custom_downloads['title'], 'tz_show_box_custom_dwnld', $custom_downloads['page'], $custom_downloads['context'], $custom_downloads['priority']);


    }

 }

 add_action('admin_menu', 'tz_add_box');

    /*------------------------------------------*/
    /* Callback function/show fields in meta box
    This is taken directly from: https://wordpress.stackexchange.com/questions/19838/create-more-meta-boxes-as-needed
    /*------------------------------------------*/


    function tz_show_box_custom_dwnld() {
        global $custom_downloads, $post;
        // Use nonce for verification
        echo '<input type="hidden" name="tz_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';


        ?>
        <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

    }

/*-------------------------------------*/
/* Save data when post is edited
/*-------------------------------------*/


function tz_save_data($post_id) {
    global $meta_box, $meta_box_video, $meta_box_video_page, $meta_box_product_tabs, $meta_deployments, $meta_features, $meta_downloads;
    // verify nonce
    if (!wp_verify_nonce($_POST['tz_meta_box_nonce'], basename(__FILE__))) {
        return $post_id;
    }
    // check autosave
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }
    // check permissions
    if ('page' == $_POST['post_type']) {
        if (!current_user_can('edit_page', $post_id)) {
            return $post_id;
        }
    } elseif (!current_user_can('edit_post', $post_id)) {
        return $post_id;
    }


 $songs = $_POST['songs'];
    update_post_meta($post_id,'songs',$songs);


}

add_action('save_post', 'tz_save_data');

Mit dem obigen Code kann ich die dynamische Meta-Box auf meinem CPT-Bearbeitungsbildschirm generieren und Daten in den Feldern erfolgreich speichern.

Es ist mir etwas peinlich, das zuzugeben, aber ich weiß nicht, wie ich die Informationen aus diesen Feldern in meinem Thema anzeigen soll. Ich konnte andere benutzerdefinierte Metainformationen, die in anderen Feldern gespeichert sind, mithilfe von erfolgreich anzeigen

<?php $post_meta_data = get_post_custom($post->ID); ?>
<?php $custom_features = unserialize($post_meta_data['tz_features-repeat'][0]); ?>

<?php echo '<ul class="deployments">';
    foreach ($custom_deployments as $string) {
        echo '<li>'.$string.'</li>';
    }
    echo '</ul>';
?>

Jede Hilfe wäre sehr dankbar!

4
derekshirk

Das serialisierte Array, das Ihre Meta-Boxen speichern, ist deformiert. Ich habe ein paar kleine Änderungen an Ihrem Code vorgenommen, damit er funktioniert. Ich habe einen neuen Beitrag erstellt und hier ist das, was nach der Unserialisierung gespeichert wurde.

Hinweis: WordPress wird automatisch ein in post_meta gespeichertes Array deserialisieren. Verwenden Sie einen Online-Unserializer , wenn Sie jemals den Inhalt überprüfen möchten.

Array
(
[1] => Array
(
[title] => Back in Black
[track] => 1
) [2] => Array
(
[title] => Hells Bells
[track] => 2
) [3] => Array
(
[title] => Hot for Teacher
[track] => 3
) [4] => Array
(
[title] => Rack City Bitch
[track] => 4
) 
)

Um dies auf dem Frontend auszugeben, rufen Sie einfach get_post_meta () auf und durchlaufen das Array.

add_filter( 'the_content', 'get_your_track_meta' );
    function get_your_track_meta( $content ) {
        global $post;
        $metadata = get_post_meta( $post->ID, 'songs', true );
        $content .= '<ul>';
        foreach ( (array) $metadata as $meta) {
            $content .= '<li>' . $meta['title'] . ' -- ' . $meta['track'] . '</li>';
        }
        $content .= '</ul>';
        return $content;
    }

Am vorderen Ende gibt uns dies eine schöne ungeordnete Liste mit dem Titel und dem Titel:

  • Zurück in Schwarz - 1
  • Hells Bells - 2
  • Heiß auf Lehrer - 3
  • Rack City Bitch - 4

Code-Änderungen:

Ich musste Ihr Seitenfeld in Ihren Meta-Box-Definitionen in post ändern, damit es in einen Beitrag geladen werden konnte, und ich habe sie auch in die Funktion add_meta_box verschoben, damit wir uns nicht darum kümmern mussten, sie global zu machen. In Ihrer Showbox-Funktion habe ich die Variable get_post_meta in ein Array umgewandelt, um das ungültige Argument zu entfernen, das für jeden Fehler in Xdebug angegeben wurde, und Ihren Zähler repariert.

$songs = get_post_meta( $post->ID, 'songs', true );
        $c = 0;
        if ( count( $songs ) > 0 ) {
            foreach ( (array)$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++;
                }
            }
        }
2
Chris_O