wake-up-neo.net

anhänge für alle Posts eines bestimmten Post-Typs abrufen

Ich erstelle ein Widget, das eine Reihe von Bildern aus den letzten benutzerdefinierten Beiträgen zeigt. Ich möchte die folgende Abfrage ausführen:

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;

und erhalten ein Array von Anhangsobjekten. Ich bin mir nicht sicher, wie man mit der kanonischen WordPress-Methode so etwas macht. Wo soll ich anfangen?

5
dnagirl

Es scheint eine Verschwendung zu sein, zwei Schleifen zu durchlaufen, nur um einige integrierte API-Funktionen zu verwenden, die nicht für einen solchen Anwendungsfall entwickelt wurden.

Ich denke, Sie sind besser dran, um SQL in Kombination mit der Klasse wpdb schneller und sauberer zu verwenden.

Beispiel (mit geändertem 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

Was ich empfehle, ist eine Instanz von WP_Query zum Durchlaufen aller benutzerdefinierten Beitragstypen und dann get_posts() zum Abrufen der Anhänge für jeden Beitrag. Hier ist ein ungetesteter Codeausschnitt, der tun sollte, was Sie wollen:

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

Hoffe das hilft.

3
mrwweb

Wenn Sie nur an der Anzahl der Anhänge für einen bestimmten Beitragstyp interessiert sind, können Sie die Funktion von Chris geringfügig wie folgt ändern:

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

Vielleicht so etwas:

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