web-dev-qa-db-ja.com

WordPressギャラリーの 'post_gallery'フィルタはフィードでは動作しませんか?

post_gallery filter を使用して、デフォルトのWordPressギャラリーテンプレート(AKA出力コード)を自分のニーズに合わせて変更または置き換えることができます。しかし、これはRSSフィードのマークアップには影響しないようです。

私が何をしても、私のRSSフィード内のギャラリー画像のマークアップは単純に次のようになります。

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

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

それで、RSSフィードのデフォルトのWordPressギャラリーマークアップを修正する方法(フィルタ、関数など)はありますか?

私が試したこと

始めに(確認のために)、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フィルタ を使って実行しても、うまくいきません - RSSフィードのマークアップは影響を受けません。なぜかわかりません。

全体として、 これは私のfunctions.phpのコードpost_galleryに関連します)です。私は何か悪いことをしていますか?


何をしたいのかとよく聞かれるので、この場合、RSSフィードのWordPressギャラリーのマークアップを次のように変更します。

<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

あなたの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フィルタがなんらかの結果を返した場合、それがperiodの出力です。あなたが言及したif is_feedコードは、それをそれほど遠くにしないので、適用されないでしょう。

Post_galleryフック関数を調べてください。問題はおそらくどこかにあります。

編集:投稿の下部にコードへのリンクがあります。それはちょっと隠されていた。

あなたは二つの大きな問題を抱えています。まず、if is_feedコードを自分の関数の中に入れて、それをコメントアウトすることは確かに正しいことでした。あなたの関数はあなたの出力を生成することになっています。別の出力を作成している場合は、明らかにそれを変更する必要があります。

次に、これは誤りです。

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

Post_galleryフックは、ショートコードではなくフィルタフックです。その行をこれに変更します。

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

それはこれと同じくらい簡単であるべきです...

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

... 2番目の引数が''でない場合は、ギャラリー全体のショートコードがバイパスされます。ご覧のとおり、他のプラグインが干渉している場合に備えて、私はフィルタにかなり高い優先順位を付けました。

1
kaiser

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) {
    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 '';
}

編集:速度を少し改善するために、上記のコードを(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:Jetpack Carouselを使っている人は誰でも心配する必要はない。上記の関数はカスタムフィードでのみ出力を変更するので、私が見ることができる限りフロントエンドプラグインを台無しにすることはありません。

1
its_me