it-swarm.com.de

Füllen einer Seite mit Inhalten aus benutzerdefinierten Post-Feldern

Ich mache gerade einen Blog, in dem jeder Post mit dem Namen eines Songs versehen ist. Das Hinzufügen der Songs zu den Posts erfolgt relativ einfach über benutzerdefinierte Felder.

Ich brauche aber auch eine Seite, auf der alle Songs an einem Ort aufgelistet sind. Kann dies ohne Verwendung eines Plugins durchgeführt werden? Wenn das so ist, wie? (Und wenn nicht, welches ist dann das beste Plugin, um dies zu tun?)

Vielen Dank.

2
snthr

Ich schlage vor, einen Shortcode zu verwenden, da Sie so die Songliste problemlos an einer beliebigen Stelle in Ihren Inhalt, auf einer beliebigen Seite oder in einem Post einbetten können.

UPDATE: Ich wurde ein wenig mitgerissen und landete damit!

function song_list_shortcode( $attrs )
{
    $r = ( object )wp_parse_args( $attrs, array(
        'format' => '%post_title - %link',
        'link'   => '%song_key_name',
        'key'    => 'song_key_name'
    ) );

    $query = new WP_Query( array( 'meta_query' => array( array( 'key' => $r->key ) ), 'nopaging' => true, 'update_post_term_cache' => false ) );
    if ( !$query->have_posts() )
        return '';

    $meta_keys = array();
    foreach ( array( 'format', 'link' ) as $type ) {
        // find meta keys
        if ( !preg_match_all( '#%([a-z0-9_-]+)#', $r->$type, $_keys ) )
            continue;

        $_keys = array_flip( $_keys[1] );
        unset( $_keys['post_title'], $_keys['link'] ); // don't want these, not meta keys

        $meta_keys = $meta_keys + $_keys; // add new keys on to meta key stack
    }

    if ( !empty( $meta_keys ) )
        $meta_keys = array_keys( $meta_keys );

    $output = '<ul class="songs">';
    while ( $query->have_posts() ) {
        $query->the_post();

        $format = $r->format;
        $link = $r->link;

        if ( !empty( $meta_keys ) ) {
            // grab all meta data in one swoop (should be cached from query)
            $meta_data = get_post_custom( $query->post->ID );

            // swap out all meta key names with their actual value!
            foreach ( $meta_keys as $key ) {

                // using get_post_custom(), all meta data values are arrays
                if ( isset( $meta_data[ $key ][0] ) )
                    $value = esc_html( $meta_data[ $key ][0] );
                else
                    $value = ''; // meta key not found, so replace with blank

                list( $format, $link ) = str_replace( "%$key", $value, array( $format, $link ) );
            }
        }

        // swap out %post_title with actual post title
        list( $format, $link ) = str_replace( '%post_title', get_the_title(), array( $format, $link ) );

        // swap out %link in $format with actual $link
        $output .= '<li>' . str_replace( '%link', '<a href="' . get_permalink() . '">' . $link . '</a>', $format ) . '</li>';
    }

    wp_reset_postdata();

    $output .= '</ul>';
    return $output;
}
add_shortcode( 'song-list', 'song_list_shortcode' );

Sie können es so verwenden;

[song-list format="%post_title - %link - %song_date_meta_key"]
// The post title - <a href="/post/">Song Name</a> - Song Date

Sehen Sie, wie die Verwendung von % einen Metaschlüssel anzeigt, der zur Laufzeit mit dem Wert ausgetauscht wird.

Beachten Sie auch, dass %post_title und %link zwei spezielle Parameter sind, die mit dem Post-Titel bzw. dem Anker-Link ausgetauscht werden.

Sie können den Inhalt des Linktextes auch auf die gleiche Weise formatieren.

[song-list link="Date: %song_date_meta_key"]
// Post Title <a href="/post/">Date: Song Date</a>

Schließlich steuert das Attribut key, welche Posts abgerufen werden.

[song-list key="song_name"]
// Retrieves all posts with the meta key 'song_name'

Ich würde empfehlen, die fest codierten Standardeinstellungen am Anfang der Funktion durch die am häufigsten verwendeten Parameter zu ersetzen.

4
TheDeadMedic