web-dev-qa-db-ja.com

WP_Query()を使用してバックエンドに設定されているページ/ポストギャラリーの添付ファイルの画像を取得する方法

私はページのGalleryからそれらがバックエンドで設定される順序ですべての画像を検索しようとしています。

これまでのところ私は持っています:

  $my_wp_query = new WP_Query();

  $all_wp_pages = $my_wp_query->query(
    array(
      'post_type' => 'attachment',
      'post_parent' => 54,  
      'post_mime_type' =>'image',
      'post_status' => 'inherit', 
      'posts_per_page' => '20' 
      'orderby' => 'menu_order',
      'order' => 'ASC'
    )
  );

  var_dump( $all_wp_pages );

しかし、これは私がバックエンドの編集ギャラリーインターフェースで画像をドラッグアンドドロップした順序ではなく、標準/デフォルトの順序ですべての添付ファイルの画像を返すようです。

これは、具体的にはギャラリーではなく自分のページのすべての添付ファイル画像を照会しているため、ギャラリーの並べ替え情報が返された配列に渡されないためです。

バックエンドに設定されている順序で特定のpage_idのすべてのギャラリー画像を取得する方法を教えてもらえますか。それが助けになるのであれば、ページごとに1つのギャラリーしかないでしょう。

ありがとう

4
Larry B

3.5メディアマネージャでギャラリーを作成するとき、menu_orderは画像の順序を保存するために使用されなくなりました。Insert Gallery属性を介してids=ボタンをクリックしたときに挿入するショートコードにのみ順序があります。これは、menu_orderを介して複数のギャラリーを単一のポストオーダーに追加できるようになったため、このケースではうまくいかないという事実に対応するためです。これらのIDを抽出するには、galleryショートコードの投稿コンテンツを検索するために少し正規表現を使用する必要があります。その後、これらのIDをpost__inクエリで使用します。 -3.5 orderby value post__in

私が正規表現に慣れていれば、これはそれほど複雑ではないでしょうが、残念なことに私はそれがひどいので、いくつかのネイティブWP関数を使用してこれらのidを抽出するためにいくつかのバックフリップを行います。属性これは、投稿コンテンツの単一または複数のギャラリーで機能します。私はこれを投稿のループに落とし込んでテストしました。投稿/ページのコンテンツを取得している場所がどこであっても$post->post_contentを変更したいと思うでしょう。

$pattern = get_shortcode_regex();

if( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
    && array_key_exists( 2, $matches )
    && in_array( 'gallery', $matches[2] ) ):

        $keys = array_keys( $matches[2], 'gallery' );

        foreach( $keys as $key ):
            $atts = shortcode_parse_atts( $matches[3][$key] );
                if( array_key_exists( 'ids', $atts ) ):

                    $images = new WP_Query(
                        array(
                            'post_type' => 'attachment',
                            'post_status' => 'inherit',
                            'post__in' => explode( ',', $atts['ids'] ),
                            'orderby' => 'post__in'
                        )
                    );

                    if( $images->have_posts() ):
                        // loop over returned images
                    endif;

                    wp_reset_query();

                endif;
        endforeach;

endif;
11
Milo

あなたは正しいです。

Menu_orderは、ギャラリーのメディアには使用されなくなりました。残念ながら、ギャラリーオーダーの唯一の「ソース」は、ページ/投稿コンテンツに埋め込まれているギャラリーショートコードの「ids」引数です。

これが意図的なものなのか、それとも見落としによるものなのかは定かではありませんが、ページや投稿に「添付」されていなくてもギャラリーにメディアを含めることができるので、意図的なものです。いずれにせよ、以下は私がidをつかみ、ショートコードで指定された順番に基づいて添付ファイルを取得するのに使う方法です。

重要なのは、get_postsへの呼び出しの "orderby"パラメータは "post__in"でなければならないということです。これは、 "include"パラメータで指定された投稿IDの順序で並べるように指示します。下記参照。

// helper function to return first regex match
function get_match( $regex, $content ) {
    preg_match($regex, $content, $matches);
    return $matches[1];
} 

// Extract the shortcode arguments from the $page or $post
$shortcode_args = shortcode_parse_atts(get_match('/\[gallery\s(.*)\]/isU', $post->post_content));

// get the ids specified in the shortcode call
$ids = $shortcode_args["ids"];

// get the attachments specified in the "ids" shortcode argument
$attachments = get_posts(
    array(
        'include' => $ids, 
        'post_status' => 'inherit', 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image', 
        'order' => 'menu_order ID', 
        'orderby' => 'post__in', //required to order results based on order specified the "include" param
    )
);

これは理想的なことではなく、WP coreがこの順序をデータベースのどこかに格納すればいいのですが、より良い方法が見つかるまでうまくいきます。

それが役立つことを願っています!

3
anderly
$oImages = get_posts(
    array(
         'numberposts' => -1,
         'post_parent' => $post->ID,
         'post_status' => 'inherit',
         'post_type' => 'attachment',
         'post_mime_type' => 'image',
         'order' => 'ASC',
         'orderby' => 'menu_order'
         )
);

このスニペットはいつも私のために働きました。

0
Steve

もっと簡単な方法を探しているのなら、添付ファイルプラグインを使うことができます。

http://wordpress.org/plugins/attachments/ /

それはギャラリーを別々に保ち、投稿コンテンツに画像ギャラリーのショートコードを入れないので、あなたの投稿/ページ/カスタム投稿の画像表示を完全に保留することができます。ドラッグアンドドロップで画像の順番を変えることもできます。

ギャラリーの画像を取得する方法のサンプルコードは、次のとおりです。

<?php $attachments = new Attachments( 'attachments' ); /* pass the instance name */ ?>
<?php if( $attachments->exist() ) : ?>
  <h3>Attachments</h3>
  <p>Total Attachments: <?php echo $attachments->total(); ?></p>
  <ul>
    <?php while( $attachments->get() ) : ?>
      <li>
        ID: <?php echo $attachments->id(); ?><br />
        Type: <?php echo $attachments->type(); ?><br />
        Subtype: <?php echo $attachments->subtype(); ?><br />
        URL: <?php echo $attachments->url(); ?><br />
        Image: <?php echo $attachments->image( 'thumbnail' ); ?><br />
        Source: <?php echo $attachments->src( 'full' ); ?><br />
        Size: <?php echo $attachments->filesize(); ?><br />
        Title Field: <?php echo $attachments->field( 'title' ); ?><br />
        Caption Field: <?php echo $attachments->field( 'caption' ); ?>
      </li>
    <?php endwhile; ?>
  </ul>
<?php endif; ?> 
0
Rao