web-dev-qa-db-fra.com

Comment exécuter WP_Query pour récupérer des pièces jointes aux publications d'une catégorie particulière uniquement?

J'ai un WP blog avec quelques pages et messages et plusieurs catégories. Je veux écrire une boucle pour récupérer des images attachées aux messages (pas les pages) et uniquement celles d'une catégorie spécifique et ses enfants. L'identifiant de la catégorie est 60.

C'est l'appel WP_Query:

$my_query = new WP_Query( array(
  'post_type' => 'attachment',
  'cat' => '60',
  'post_mime_type' =>'image',
  'posts_per_page' => $batch_size,
  'nopaging' => false,
  'post_status' => 'all',
  'post_parent' => null,
  'meta_key' => 'my_hash',
  'orderby' => 'meta_value'
) );

Mais je n'ai rien!

Qu'est-ce que je fais mal?

2
aalaap

Vous devez d'abord saisir les messages, puis les pièces jointes qui sont les enfants de ces messages.

$my_query = new WP_Query( array(
    'meta_key' => 'my_hash',
    'nopaging' => true,
    'orderby' => 'meta_value',
    'fields' => 'ids',
    'cat' => '60',
));

if ( $post_ids = $my_query->get_posts() ) {
    $post_ids = implode( ',', $post_ids );
    $atts_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_parent IN($post_ids) AND post_type = 'attachment'" );   

    $my_query->query( array(
        'posts_per_page' => $batch_size,
        'post_mime_type' =>'image',
        'post_status' => 'all',
        'post_type' => 'attachment',
        'post__in' => $atts_ids,
    ));
}
1
TheDeadMedic

Les publications en pièce jointe n'ont pas de catégories, les publications de leurs parents en ont, donc vous avez un problème en deux étapes.

  • Trouver les identifiants des posts de type post dans la catégorie (60?)
  • Recherchez les pièces jointes ayant un post_parent figurant dans la liste que nous avons trouvée dans notre première requête.
1
Tom J Nowell

Si vous souhaitez obtenir des liens d’image à partir de catégories et de sous-catégories, vous devez utiliser ceci:

    global $wpdb;
$id = 60; // your cat id
$myrows = $wpdb->get_results( "SELECT p2.ID, p2.guid ".
    "FROM $wpdb->posts as p1, $wpdb->posts as p2, $wpdb->term_relationships as tr, $wpdb->term_taxonomy as tt  ".
    "WHERE ".
    "((tr.term_taxonomy_id = $id AND ".
    "p1.ID = tr.object_id) OR ".
    "(tt.parent = $id AND ".
    "tr.term_taxonomy_id = tt.term_taxonomy_id AND ".
    "p1.ID = tr.object_id)) AND ".
    "p1.post_status = 'publish' AND ".
    "p2.post_parent = p1.ID AND ".
    "p2.post_mime_type LIKE 'image%'".
    "GROUP BY p2.ID".
    "<= 5". // you able to limit the db answer
    "", ARRAY_A );
print_r( $myrows );
0
Alexei Isaenko