O filtro 'post_gallery' da galeria de WordPress não funciona com feeds?

2

Podemos usar o filtro post_gallery para modificar / substituir o modelo de galeria padrão do WordPress (código de saída AKA ) para atender às nossas necessidades. Mas isso não parece afetar a marcação nos feeds RSS.

Não importa o que eu faça, a marcação das imagens da galeria no meu feed RSS é simplesmente assim:

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

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

Então, existe uma maneira (algo como um filtro, função, etc.) para modificar a marcação padrão da galeria do WordPress em feeds RSS?

O que eu tentei

Para começar (apenas para verificar), tudo o que eu tive que fazer foi comentar este bit no arquivo wp-includes/media.php core:

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

E isso meio que funcionou. Agora, a marcação da galeria em meus feeds RSS é a mesma que você vê no front-end do meu site (ou seja, em posts).

Mas quando eu faço o mesmo usando o post_gallery filter , ele não funciona - a marcação em feeds RSS não é afetado. Não faço ideia do porquê!

No geral, este é o código (relacionado a post_gallery ) no meu functions.php. Estou fazendo algo errado?

Como me perguntam com frequência o que estou tentando fazer - nesse caso, quero modificar a marcação de galerias do WordPress em feeds RSS para ficar assim:

<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>
    
por its_me 03.09.2012 / 15:54

3 respostas

8

Sem saber o que faz a sua função de filtro post_gallery, não há como dar uma resposta adequada.

No entanto, se você estiver usando o filtro post_gallery e retornando uma nova marcação, sim, ela também será usada em feeds. O código que você mencionou comentando acontece após o filtro post_gallery e não será executado se você retornar uma saída diferente desse filtro, conforme o código a seguir:

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

Se o filtro post_gallery retornar alguma coisa, então é isso que é a saída, ponto final. O código if_feed que você mencionou não será aplicado, já que nunca chega tão longe.

Examine sua função de gancho post_gallery. O problema provavelmente está em algum lugar.

Editar : Encontrou o link para o seu código na parte inferior da sua postagem. Foi meio escondido.

Você tem dois grandes problemas. Em primeiro lugar, você tinha o código if_feed dentro de sua própria função e comentá-lo era realmente a coisa correta a ser feita. Sua função deve produzir sua saída. Se você está produzindo saída diferente, então você precisa mudar isso, obviamente.

Em segundo lugar, isso está incorreto:

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

O gancho post_gallery é um gancho de filtro, não um shortcode. Mude essa linha para isto:

add_filter('post_gallery', 'flipboard_gallery_shortcode', 10, 2);
    
por Otto 05.09.2012 / 16:58
1

Deve ser tão simples assim ...

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

... como todo o shortcode da galeria é ignorado, quando o segundo argumento não é '' . Como você pode ver, eu adicionei uma prioridade muito alta para o filtro, apenas no caso de outros plugins estarem interferindo.

    
por kaiser 05.09.2012 / 17:03
1

Com base nas sugestões de Otto, modifiquei minha função como tal (veja abaixo) e funcionou!

// 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: Para uma melhoria menor de velocidade, o mesmo código acima pode ser reescrito como (graças a 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: Qualquer pessoa que esteja usando o Jetpack Carousel não precisa se preocupar. A função acima apenas modifica a saída apenas no feed personalizado e, portanto, não interfere com nenhum plug-in de frontend até onde eu possa ver.

    
por its_me 03.09.2012 / 21:49