web-dev-qa-db-ja.com

特定の投稿タイプのすべての投稿の添付ファイルを取得する

最近のカスタム投稿の一連の画像を表示するウィジェットを作成しています。次のクエリを実行します。

SELECT p.* 
FROM wp_posts p
WHERE post_type='attachment'
AND post_mime_type LIKE 'image%'
AND post_parent IN (
  SELECT ID
  FROM wp_posts
  WHERE post_type ='my_custom_post_type'
)
ORDER BY post_date DESC
LIMIT 10;

そして、添付オブジェクトの配列を受け取ります。私はこのようなことをするための正規のWordPressメソッドについては不明です。どこから始めればいいですか。

5
dnagirl

このようなユースケース用に設計されていない組み込みのAPI関数を使用するためだけに2つのループを実行するのは少し無駄に思えます。

自分のSQLを wpdb class - と組み合わせて使う方が速くてきれいになるほうがいいと思います。

例(SQLを修正したもの):

<?php
function wpse52315_get_attach()
{
    global $wpdb;
    $res = $wpdb->get_results("select p1.*
        FROM {$wpdb->posts} p1, {$wpdb->posts} p2
        WHERE p1.post_parent = p2.ID 
           AND p1.post_mime_type LIKE 'image%'
           AND p2.post_type = 'your_cpt'
        ORDER BY p2.post_date
        LIMIT 10;"
    );
    return $res;
}
5
chrisguitarguy

私がお勧めするのは、すべてのカスタム投稿タイプの投稿をループ処理するための WP_Query のインスタンス、そして各投稿の添付ファイルを取得するための get_posts() のインスタンスです。ここにあなたが望むことをするべきであるテストされていないコードスニペットがあります:

// Setup array for storing objects
$my_attachment_objects = array();

// Arguments for custom WP_Query loop
$my_cpts_args = array(
    'post_type' => 'my_custom_post_type',
    'posts_per_page' => 10
);

// Make the new instance of the WP_Query class
$my_cpts = new WP_Query( $my_cpts_args );

// And Loop!
if( $my_cpts->have_posts() ) : while( $my_cpts->have_posts() ) : $my_cpts->the_post();

    // arguments for get_posts
    $attachment_args = array(
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'post_status' => null, // attachments don't have statuses
        'post_parent' => $post->ID
    );
    // get the posts
    $this_posts_attachments = get_posts( $attachment_args );
    // append those posts onto the array
    $my_attachment_objects[$post->ID] = $this_posts_attachments; // make an array with the post_id as the key, just in case that's useful

endwhile; endif; wp_reset_postdata();

お役に立てれば。

3
mrwweb

特定の投稿タイプの添付ファイルの数だけに関心がある場合は、Chrisの機能を次のように少し変更することができます。

<?php
function myprefix_image_count() {
    global $wpdb;
    $res = $wpdb->get_var("select COUNT(*)
        FROM {$wpdb->posts} p1, {$wpdb->posts} p2
        WHERE p1.post_parent = p2.ID
           AND p1.post_mime_type LIKE 'image%'
           AND p2.post_type = 'your_cpt_name'
        ORDER BY p2.post_date;"
    );
    $imageCount = (int)$res;
    return $imageCount;
}
?>
0
Philip Downer

多分このようなもの:

<?php
  $args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 );
  $loop = new WP_Query( array ( 'orderby' => 'title', 'order' => 'DESC' ) );  
  while ( $loop->have_posts() ) : $loop->the_post();
    the_title();
    echo '<div class="entry-content">'; the_content();
    echo '</div>';
  endwhile;
  ?>
0
Jeremy Jared