テレビ番組のブログを運営しているとしましょう。ある日、番組は次のエピソードから10個のスクリーンキャップのセットを一般に公開します。私は自分のブログに、複数の画像を含む投稿として、または具体的には「ギャラリー」投稿として投稿します。どちらの方法でも、読者はその投稿に添付されたすべての画像をギャラリーとして表示できます。
それから、数日後と数ポスト後に、同じ次回のエピソードからさらに10個のスクリーンキャップがリリースされます。私は古い記事をぶつけるのではなく、別の記事を作りたいのですが、私はまた、どういうわけかその特定のエピソードからのすべてのスクリーンキャップ(20)を単一のギャラリーに表示できるようにしたいです。あるいは、少なくとも1つのギャラリーのように見えるものです。
可能? (できればNextGENや他のプラグインなしで...プラグインを積み重ねる前にWordPressのネイティブ機能を使うことができる限り達成しようとしています。)
デフォルトの[gallery]
shortcode を使用すると、異なるギャラリーを1つにまとめる簡単な方法はありません。現在の投稿と、投稿IDで指定された別の投稿の2つの異なるギャラリーを指定できます。
[gallery]
[gallery id=42]
または、すべての添付ファイルIDを明示的に指定してギャラリーを作成することもできます。
[gallery include="23,39,45"]
gallery_shortcode()
は添付ファイルを取得するためにget_children()
を使い、これはget_posts()
を使い、これは標準のWP_Query
クラスを使い、this は数値のpost_parent
値 しか許しません。
しかし、gallery_shortcode()
の先頭にフィルターがあるという事実を利用することができます。これはプラグインがデフォルトのギャラリーレイアウトを上書きすることを可能にします。次の例では、複数のIDを持つid
パラメータ(または特殊キーワードthis
)をチェックし、これらの投稿のすべての添付ファイルを取得して、ギャラリー関数を再度呼び出すために使用される明示的なinclude
属性に配置します。これはあなたがこのような異なるギャラリーを組み合わせることを可能にします:[gallery id=this,8]
。他の属性もサポートするようにこの考えを拡張することができます。
add_filter( 'post_gallery', 'wpse18689_post_gallery', 5, 2 );
function wpse18689_post_gallery( $gallery, $attr )
{
if ( ! is_array( $attr ) || array_key_exists( 'wpse18689_passed', $attr ) ) {
return '';
}
$attr['wpse18689_passed'] = true;
if ( false !== strpos( $attr['id'], ',' ) ) {
$id_attr = shortcode_atts( array(
'id' => 'this',
'order' => 'ASC',
'orderby' => 'menu_order ID',
), $attr );
$all_attachment_ids = array();
$post_ids = explode( ',', $id_attr['id'] );
foreach ( $post_ids as $post_id ) {
if ( 'this' == $post_id ) {
$post_id = $GLOBALS['post']->ID;
}
$post_attachments = get_children( array(
'post_parent' => $post_id,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => $id_attr['order'],
'orderby' => $id_attr['orderby'],
), ARRAY_A );
$all_attachment_ids = array_merge( $all_attachment_ids, array_keys( $post_attachments ) );
}
$attr['include'] = implode( ',', $all_attachment_ids );
$attr['id'] = null;
}
return gallery_shortcode( $attr );
}