Фильтр «post_gallery» в WordPress не работает с фидами?

Мы можем использовать фильтр post_gallery для изменения / замены шаблона галереи WordPress по умолчанию (код выхода AKA) в соответствии с нашими потребностями. Но это, похоже, не влияет на разметку в RSS-каналах.

Независимо от того, что я делаю, разметка для изображений галереи в моем RSS-канале выглядит так:

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

Итак, есть ли способ (что-то вроде фильтра, функции и т. Д.), Чтобы изменить разметку галереи WordPress по умолчанию в RSS-каналах?

Что я пробовал

Для начала (только для проверки) все, что мне нужно было сделать, это прокомментировать этот бит в файле 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; } 

И это сработало. Теперь разметка галереи в моих RSS-каналах совпадает с тем, что вы видите в интерфейсе моего сайта (то есть в сообщениях).

Но когда я делаю то же самое с post_gallery фильтра post_gallery , он не работает – разметка в RSS-каналах не затрагивается. Я не имею понятия почему!

В целом, это код (связанный с post_gallery ) в моих functions.php. Я делаю что-то неправильно?


Поскольку меня часто спрашивают, что я пытаюсь сделать – в этом случае я хочу изменить разметку для галерей WordPress в RSS-каналах, чтобы выглядеть так:

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

Не зная, что делает функция фильтра post_gallery, нет никакого способа дать правильный ответ.

Однако, если вы используете фильтр post_gallery и возвращаете новую разметку, тогда да, она также будет использоваться в фидах. Код, который вы упоминаете, комментирует, происходит после фильтра post_gallery и вообще не будет выполняться, если вы возвращаете другой результат из этого фильтра, согласно следующему коду:

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

Если фильтр post_gallery возвращает что-либо вообще, то это то, что выводится, период. Код if_feed, который вы упомянули, не будет применяться, поскольку он никогда не делает это так далеко.

Изучите функцию зацепившейся функции post_gallery. Вероятно, проблема там где-то.

Изменить : найдите ссылку на свой код внизу своего сообщения. Это было сокрыто.

У вас две основные проблемы. Во-первых, у вас был код if_feed внутри вашей собственной функции, и комментирование этого было действительно правильным. Предполагается, что ваша функция будет выдавать ваш результат. Если вы производите разный вывод, то вам, очевидно, нужно это изменить.

Во-вторых, это неверно:

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

Крючок post_gallery – это крючок фильтра, а не короткий код. Измените эту строку следующим образом:

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

Это должно быть так просто, как это …

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

… так как весь общий код галереи обходит, когда второй аргумент не равен '' . Как вы можете видеть, я добавил довольно высокий приоритет для фильтра, на всякий случай, если другие плагины интерферируют.

Основываясь на предложениях Отто, я изменил свою функцию как таковую (см. Ниже), и это сработало!

 // 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: для незначительного улучшения скорости один и тот же код может быть переписан как (спасибо Отто!):

 // 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: Любой, кто использует карусель Jetpack, не должен беспокоиться. Функция выше только изменяет выход только в пользовательском канале и, следовательно, не вмешивается в какие-либо интерфейсные плагины, насколько я могу видеть.