web-dev-qa-db-fra.com

Le filtre 'post_gallery' de la galerie WordPress ne fonctionne pas avec les flux?

Nous pouvons utiliser le filtre post_gallery pour modifier/remplacer le modèle de galerie WordPress par défaut (code de sortie AKA) en fonction de nos besoins. Mais cela ne semble pas affecter le balisage dans les flux RSS.

Peu importe ce que je fais, le balisage des images de galerie dans mon flux RSS est simplement le suivant:

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

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

Alors, y a-t-il un moyen (quelque chose comme un filtre, une fonction, etc.) de modifier le balisage de galerie WordPress par défaut dans les flux RSS?

Ce que j'ai essayé

Pour commencer (juste pour vérifier), tout ce que je devais faire était de commenter ce bit dans le fichier de base wp-includes/media.php:

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

Et ça a fonctionné un peu. Maintenant, le balisage de la galerie dans mes flux RSS est identique à ce que vous voyez sur le front-end de mon site (c'est-à-dire dans les messages).

Mais lorsque je fais la même chose en utilisant le filtre post_gallery , cela ne fonctionne pas - le balisage dans les flux RSS n'est pas affecté. Je ne sais pas pourquoi!

Au total, c'est le code (lié à post_gallery) dans mon functions.php. Est-ce que je fais quelque chose de mal?


Comme on me demande souvent ce que j'essaie de faire, dans ce cas, je souhaite modifier le balisage des galeries WordPress dans les flux RSS pour qu'il ressemble à ceci:

<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

Sans savoir ce que fait votre fonction de filtre post_gallery, il n’ya aucun moyen de donner une réponse correcte.

Cependant, si vous utilisez le filtre post_gallery et que vous retournez un nouveau balisage, alors oui, il sera également utilisé dans les flux. Le code que vous mentionnez commentant se produit après le filtre post_gallery et ne sera pas exécuté du tout si vous renvoyez une sortie différente de ce filtre, conformément au code suivant:

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

Si le filtre post_gallery renvoie quoi que ce soit, c'est ce qui est généré, le point. Le code if is_feed que vous avez mentionné ne sera pas appliqué car il ne le mènera jamais aussi loin.

Examinez votre fonction accrochée post_gallery. Le problème est probablement là quelque part.

Edit : Vous avez trouvé le lien vers votre code au bas de votre message. C'était en quelque sorte caché.

Vous avez deux problèmes majeurs. Premièrement, vous aviez le code if_feed dans votre propre fonction, et le commenter était en effet la bonne chose à faire. Votre fonction est supposée produire votre sortie. Si vous produisez une sortie différente, vous devez évidemment changer cela.

Deuxièmement, c'est inexact:

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

Le hook post_gallery est un hook de filtre, pas un shortcode. Changez cette ligne en ceci:

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

Ça devrait être aussi simple que ça ...

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 );

... car le shortcode de la galerie entière est ignoré, quand le second argument n'est pas ''. Comme vous pouvez le constater, j’ai ajouté une priorité assez élevée pour le filtre, au cas où d’autres plug-ins s’interféreraient.

1
kaiser

Sur la base des suggestions d'Otto, j'ai modifié ma fonction en tant que telle (voir ci-dessous) et cela a fonctionné!

// 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: Pour une légère amélioration de la vitesse, le même code ci-dessus peut être réécrit comme (grâce à Otto!):

// 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: Toute personne utilisant Jetpack Carousel n'a pas à s'inquiéter. La fonction ci-dessus ne modifie que la sortie dans le flux personnalisé, et par conséquent ne gêne pas les plugins frontaux pour autant que je puisse voir.

1
its_me