wake-up-neo.net

WordPress Galerie 'post_gallery' Filter funktioniert nicht mit Feeds?

Wir können den post_gallery-Filter verwenden um die Standardvorlage für die WordPress-Galerie (AKA-Ausgabecode) entsprechend unseren Anforderungen zu ändern/zu ersetzen. Dies scheint jedoch keinen Einfluss auf das Markup in RSS-Feeds zu haben.

Egal was ich mache, das Markup für Galeriebilder in meinem RSS-Feed sieht einfach so aus:

<a href="#1">
   <img src="#2" />
</a>

<a href="#3">
   <img src="#4" />
</a>

Gibt es also eine Möglichkeit (so etwas wie ein Filter, eine Funktion usw.), das standardmäßige WordPress-Galerie-Markup in RSS-Feeds zu ändern?

Was ich versucht habe

Zunächst musste ich (nur zur Kontrolle) dieses Bit in der wp-includes/media.php-Kerndatei auskommentieren:

if ( is_feed() ) {
    $output = "\n";
    foreach ( $attachments as $att_id => $attachment )
        $output .= wp_get_attachment_link($att_id, $size, true) . "\n";
    return $output;
}

Und es hat irgendwie funktioniert. Jetzt entspricht das Galerie-Markup in meinen RSS-Feeds dem, was Sie im Front-End meiner Website sehen (d. H. In Beiträgen).

Aber wenn ich dasselbe mache mit dem post_gallery-Filter , funktioniert es nicht - das Markup in RSS-Feeds bleibt davon unberührt. Ich habe keine Idee warum!

Insgesamt das ist der Code (bezogen auf post_gallery) in meiner functions.php. Mache ich etwas falsch?


Da ich häufig gefragt werde, was ich zu tun versuche, möchte ich in diesem Fall das Markup für WordPress-Galerien in RSS-Feeds folgendermaßen ändern:

<section class="fl-slideshow">
  <figure>
    <img src="#2" width="1200" height="900">
    <figcaption>Puppies are cute</figcaption>
  </figure>
  <figure>
    <img src="#4" width="900" height="1200">
    <figcaption>Kittens are too</figcaption>
  </figure>
</section>
2
its_me

Ohne zu wissen, was Ihre post_gallery-Filterfunktion tut, gibt es keine Möglichkeit, eine richtige Antwort zu geben.

Wenn Sie jedoch den Filter post_gallery verwenden und neues Markup zurückgeben, wird es auch in Feeds verwendet. Der von Ihnen erwähnte Code zum Auskommentieren erfolgt nach dem Filter post_gallery und wird überhaupt nicht ausgeführt, wenn Sie eine andere Ausgabe dieses Filters gemäß dem folgenden Code zurückgeben:

// Allow plugins/themes to override the default gallery template.
$output = apply_filters('post_gallery', '', $attr);
if ( $output != '' )
    return $output;

Wenn der Filter post_gallery überhaupt irgendetwas zurückgibt, wird genau dieser Punkt ausgegeben. Der von Ihnen erwähnte if is_feed-Code wird nicht angewendet, da er es nie so weit bringt.

Untersuchen Sie Ihre Funktion post_gallery hooked. Das Problem liegt wahrscheinlich irgendwo da.

Bearbeiten : Finden Sie den Link zu Ihrem Code am unteren Rand Ihres Beitrags. Es war irgendwie versteckt.

Sie haben zwei Hauptprobleme. Erstens hatten Sie den if is_feed-Code in Ihrer eigenen Funktion, und das Auskommentieren war in der Tat das Richtige. Ihre Funktion soll Ihre Ausgabe produzieren. Wenn Sie eine andere Ausgabe produzieren, müssen Sie dies natürlich ändern.

Zweitens ist das falsch:

add_shortcode('post_gallery', 'flipboard_gallery_shortcode', 10, 2);

Der post_gallery-Hook ist ein Filter-Hook, kein Shortcode. Ändern Sie diese Zeile in:

add_filter('post_gallery', 'flipboard_gallery_shortcode', 10, 2);
8
Otto

So einfach sollte es sein ...

function wpse63980_gallery_shortcode( $html, $attr )
{
    // We don't want to intercept non feed galleries
    if ( ! is_feed() )
        return '';

    extract( shortcode_atts( array(
        'order'      => 'ASC',
        'orderby'    => 'menu_order ID',
        'id'         => $post->ID,
        'itemtag'    => 'dl',
        'icontag'    => 'dt',
        'captiontag' => 'dd',
        'columns'    => 3,
        'size'       => 'thumbnail',
        'include'    => '',
        'exclude'    => ''
    ), $attr ) );

    // get_posts(), get_attachments(), etc. here

    return $html;
}
add_filter( 'post_gallery', 'wpse63980_gallery_shortcode', 99999, 2 );

... da der gesamte Galerie-Shortcode umgangen wird, wenn das zweite Argument nicht '' ist. Wie Sie sehen, habe ich dem Filter eine ziemlich hohe Priorität hinzugefügt, nur für den Fall, dass andere Plugins stören.

1
kaiser

Aufgrund von Ottos Vorschlägen habe ich meine Funktion als solche geändert (siehe unten) und es hat funktioniert!

// Custom Gallery Code For Flipboard/Pulse/Google Currents Feeds
add_filter('post_gallery', 'flipboard_gallery_shortcode', 10, 2);
function flipboard_gallery_shortcode($output, $attr) {
    global $post;

    static $instance = 0;
    $instance++;

    // We're trusting author input, so let's at least make sure it looks like a valid orderby statement
    if ( isset( $attr['orderby'] ) ) {
        $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
        if ( !$attr['orderby'] )
            unset( $attr['orderby'] );
    }

    extract(shortcode_atts(array(
        'order'      => 'ASC',
        'orderby'    => 'menu_order ID',
        'id'         => $post->ID,
        'itemtag'    => 'dl',
        'icontag'    => 'dt',
        'captiontag' => 'dd',
        'columns'    => 3,
        'size'       => 'full',
        'include'    => '',
        'exclude'    => ''
    ), $attr));

    $id = intval($id);
    if ( 'Rand' == $order )
        $orderby = 'none';

    if ( !empty($include) ) {
        $include = preg_replace( '/[^0-9,]+/', '', $include );
        $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );

        $attachments = array();
        foreach ( $_attachments as $key => $val ) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    } elseif ( !empty($exclude) ) {
        $exclude = preg_replace( '/[^0-9,]+/', '', $exclude );
        $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    } else {
        $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    }

    if ( empty($attachments) )
        return '';

    // Modifying for a different gallery output ONLY in my custom feed
    if ( is_feed( 'flipboard_feed' ) ) {
        $output = '<section class="fl-slideshow">';
        foreach ( $attachments as $att_id => $attachment )
            $output .= '<figure>' . wp_get_attachment_image($att_id, 'full') . '<figcaption>' . wptexturize($attachment->post_excerpt) . '</figcaption></figure>';
        $output .= '</section>';
        return $output;
    }

    // Let the original function return the default output for other feeds and posts
    return '';
}

EDIT: Für eine geringfügige Geschwindigkeitsverbesserung kann derselbe Code wie (danke an Otto!) Umgeschrieben werden:

// Custom Gallery Code For Flipboard/Pulse/Google Currents Feeds
add_filter('post_gallery', 'flipboard_gallery_shortcode', 10, 2);
function flipboard_gallery_shortcode($output, $attr) {

    // Modifying for a different gallery output ONLY in my custom feed
    if ( is_feed( 'flipboard_feed' ) ) {
        global $post;

        static $instance = 0;
        $instance++;

        // We're trusting author input, so let's at least make sure it looks like a valid orderby statement
        if ( isset( $attr['orderby'] ) ) {
            $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
            if ( !$attr['orderby'] )
                unset( $attr['orderby'] );
        }

        extract(shortcode_atts(array(
            'order'      => 'ASC',
            'orderby'    => 'menu_order ID',
            'id'         => $post->ID,
            'itemtag'    => 'dl',
            'icontag'    => 'dt',
            'captiontag' => 'dd',
            'columns'    => 3,
            'size'       => 'thumbnail',
            'include'    => '',
            'exclude'    => ''
        ), $attr));

        $id = intval($id);
        if ( 'Rand' == $order )
            $orderby = 'none';

        if ( !empty($include) ) {
            $include = preg_replace( '/[^0-9,]+/', '', $include );
            $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );

            $attachments = array();
            foreach ( $_attachments as $key => $val ) {
                $attachments[$val->ID] = $_attachments[$key];
            }
        } elseif ( !empty($exclude) ) {
            $exclude = preg_replace( '/[^0-9,]+/', '', $exclude );
            $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
        } else {
            $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
        }

        if ( empty($attachments) )
            return '';

            // Essentially these are only changes I've made
            $output = '<section class="fl-slideshow">';
            foreach ( $attachments as $att_id => $attachment )
                $output .= '<figure>' . wp_get_attachment_image($att_id, 'full') . '<figcaption>' . wptexturize($attachment->post_excerpt) . '</figcaption></figure>';
                $output .= '</section>';
            return $output;
    }

    // Let the original function return the default output for other feeds and posts
    return '';

}

PS: Wer Jetpack Carousel benutzt, braucht sich keine Sorgen zu machen. Die obige Funktion ändert nur die Ausgabe im benutzerdefinierten Feed und führt daher meines Erachtens zu keinerlei Problemen mit Frontend-Plug-ins .

1
its_me