Ich wurde neugierig auf die SQL-Methode, um alle Beiträge ohne Anhänge zu finden.
Methode 1 - Unterabfrage mit NOT IN
Hier ist mein erster Versuch, eine solche Abfrage zu erstellen:
global $wpdb;
$sql = "
SELECT p1.ID, p1.post_title
FROM {$wpdb->posts} p1
WHERE p1.post_type = 'post'
AND p1.post_status = 'publish'
AND p1.ID NOT IN (
SELECT DISTINCT p2.post_parent
FROM {$wpdb->posts} p2
WHERE p2.post_type = 'attachment' AND p2.post_parent > 0
)
ORDER BY p1.post_date DESC
";
// Fetch posts without attachments:
$posts_without_attachments = $wpdb->get_results( $sql );
// Display posts without attachments:
foreach( $posts_without_attachments as $post )
{
echo $post->post_title . '<br/>';
}
Dies ist der Abfrage von @ toscho sehr ähnlich, aber in der Syntax weniger rationalisiert ;-)
Methode 2 - LEFT JOIN
mitIS NULL
Diese Abfrage scheint auch zu funktionieren:
global $wpdb;
$sql = "
SELECT p1.ID, p1.post_title
FROM {$wpdb->posts} p1
LEFT JOIN {$wpdb->posts} p2
ON ( p2.post_parent = p1.ID AND p2.post_type = 'attachment' )
WHERE p1.post_type = 'post'
AND p1.post_status = 'publish'
AND p2.post_parent IS NULL
ORDER BY p1.post_date DESC
";
// Fetch posts without attachments:
$posts_without_attachments = $wpdb->get_results( $sql );
Hier verbinden wir die Posts-Tabelle mit sich selbst und nehmen dann die NULL
Zeilen in der übergeordneten Spalte der Anhänge auf.
Methode 3 - WP_Query mit dem posts_where-Filter, auch bekannt als Methode 1
Wir könnten das auch WP_Query()
mit dem posts_where
Filter ändern :
// Filter all posts without attachments:
add_filter( 'posts_where', 'wpse_no_attachments' );
// Query:
$q = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => -1 ) );
// Remove the filter:
remove_filter( 'posts_where', 'wpse_no_attachments' );
wo:
function wpse_no_attachments( $where )
{
global $wpdb;
$where .= " AND {$wpdb->posts}.ID NOT IN (
SELECT DISTINCT wpse.post_parent
FROM {$wpdb->posts} wpse
WHERE wpse.post_type = 'attachment' AND wpse.post_parent > 0 ) ";
return $where;
}