¿El filtro 'post_gallery' de la galería de WordPress no funciona con las fuentes?

2

Podemos usar el filtro post_gallery para modificar / reemplazar la plantilla de la galería de WordPress predeterminada (código de salida AKA ) para satisfacer nuestras necesidades. Pero esto no parece afectar el marcado en las fuentes RSS.

No importa lo que haga, el marcado para las imágenes de la galería en mi fuente RSS es simplemente así:

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

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

Entonces, ¿hay alguna forma (algo como un filtro, función, etc.) para modificar el marcado predeterminado de la galería de WordPress en las fuentes RSS?

Lo que he probado

Para empezar (solo para verificar), todo lo que tuve que hacer fue comentar este bit en wp-includes/media.php core file:

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

Y funcionó un poco. Ahora, el marcado de la galería en mis fuentes RSS es el mismo que se ve en la parte delantera de mi sitio (es decir, en publicaciones).

Pero cuando hago lo mismo utilizando el filtro post_gallery , no funciona: el marcado en feeds RSS no se ve afectado. ¡No tengo idea de por qué!

En general, este es el código (relacionado con post_gallery ) en mis funciones.php. ¿Estoy haciendo algo mal?

Ya que a menudo me preguntan qué intento hacer, en este caso, quiero modificar el marcado de las galerías de WordPress en feeds RSS para que se vea así:

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

3 respuestas

8

Sin saber qué hace su función de filtro de post_gallery, no hay forma de dar una respuesta correcta.

Sin embargo, si está utilizando el filtro post_gallery y está devolviendo un nuevo marcado, entonces sí, también se usará en feeds. El código que menciona al comentarlo sucede después del filtro de post_gallery, y no se ejecutará en absoluto si está devolviendo una salida diferente de ese filtro, según el siguiente código:

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

Si el filtro post_gallery devuelve algo, entonces eso es lo que es salida, punto. El código if is_feed que mencionas no se aplicará ya que nunca llega tan lejos.

Examine su función enganchada post_gallery. El problema probablemente se encuentra en alguna parte.

Editar : encontró el enlace a su código al final de su publicación. Estaba algo escondido.

Tienes dos problemas principales. En primer lugar, tenía el código if is_feed dentro de su propia función, y comentarlo fue lo correcto. Se supone que tu función produce tu salida. Si está produciendo una salida diferente, entonces necesita cambiar eso, obviamente.

Segundo, esto es incorrecto:

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

El gancho post_gallery es un gancho de filtro, no un shortcode. Cambie esa línea a esto:

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

Debería ser tan simple como esto ...

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

... ya que se omite todo el shortcode de la galería, cuando el segundo argumento no es '' Como puede ver, agregué una prioridad bastante alta para el filtro, en caso de que otros complementos estén interfiriendo.

    
respondido por el kaiser 05.09.2012 - 17:03
1

Basado en las sugerencias de Otto, modifiqué mi función como tal (ver más abajo), ¡y funcionó!

// 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 '';
}

EDITAR: Para una mejora menor de la velocidad, el mismo código anterior se puede reescribir (gracias 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: Cualquiera que use Jetpack Carousel no debe preocuparse. La función anterior solo modifica la salida solo en la fuente personalizada, y por lo tanto no se mete con ningún complemento frontend por lo que puedo ver.

    
respondido por el its_me 03.09.2012 - 21:49

Lea otras preguntas en las etiquetas