wake-up-neo.net

Holen Sie sich alle Beiträge (von jedem Beitragstyp), in denen ein Anhang verwendet wird

Es ist nicht einfach, die Anzahl der Posts zu zählen, an die ein Bild angehängt ist - WordPress merkt sich das einfach nicht. Es wird nur der Beitrag protokolliert, in den ein Anhang ursprünglich hochgeladen wurde (und nicht unbedingt auch dort verwendet wird).

enter image description here

Plugin

Damit Sie so schnell wie möglich loslegen können, finden Sie hier den Plugin-Code:

<?php
/**
 * Plugin Name: Media Count
 * Description: Adds a column to the media admin list table to show the count of posts
 */

add_filter( 'manage_media_columns', function( $cols, $detached )
{
    $cols['count'] = 'Count';
    $cols['size']  = 'Size';
    return $cols;
}, 10, 2 );

add_action( 'manage_media_custom_column', function( $col, $id )
{
    switch ( $col )
    {
        case 'size' :
            $meta = wp_get_attachment_metadata( $id );
            // Image
            isset( $meta['width'] )
                AND print "{$meta['width']} &times; {$meta['height']}";
            // Audio
            isset( $meta['bitrate'] )
                AND print "{$meta['length_formatted']} min";
            break;
        case 'count' :
            $att  = get_post_custom( $id );
            $file = $att['_wp_attached_file'][0];
            // Do not take full path as different image sizes could
            // have different month, year folders due to theme and image size changes
            $file  = pathinfo( $file, PATHINFO_FILENAME );
            // @TODO Fill in the blanks
            break;
    }
}, 10, 2 );

Frage:

So zählen Sie die Anzahl der Posts, in denen ein Anhang verwendet wird - auf die effizienteste Art und Weise.

Letztes Plugin

Das vollständige Plugin kannhier als Gist heruntergeladen werden.

4
kaiser

Zweiter Durchgang . Bekannte Probleme:

  • Muss zwischengespeichert werden (und der Cache muss nach Möglichkeit aufgeräumt werden)
  • Beitragstypen sind fest codiert
  • Für welche Post-Status interessieren wir uns?

Hier ist die Funktion:

/**
 * Given an attachment ID, searches for any post with that attachment used
 * as a featured image, or if it is present in the content of the post.
 * (Note above known issues).
*/
function get_image_count( $id ){
    global $wpdb;

    $att  = get_post_custom( $id );
    $file = $att['_wp_attached_file'][0];
    //Do not take full path as different image sizes could
    // have different month, year folders due to theme and image size changes
    $file = sprintf( "%s.%s",
        pathinfo( $file, PATHINFO_FILENAME ),
        pathinfo( $file, PATHINFO_EXTENSION )
    );

    $sql = "SELECT {$wpdb->posts}.ID 
        FROM {$wpdb->posts} 
        INNER JOIN {$wpdb->postmeta} 
        ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id) 
        WHERE {$wpdb->posts}.post_type IN ('post', 'page', 'event') 
        AND (({$wpdb->posts}.post_status = 'publish')) 
        AND ( ({$wpdb->postmeta}.meta_key = '_thumbnail_id' 
            AND CAST({$wpdb->postmeta}.meta_value AS CHAR) = '%d') 
            OR ( {$wpdb->posts}.post_content LIKE %s )
        ) 
        GROUP BY {$wpdb->posts}.ID";

    $prepared_sql = $wpdb->prepare( $sql, $id, "%src=\"%".$wpdb->esc_like( $file )."\"%" );

    $post_ids  = $wpdb->get_results( $prepared_sql );

    $count = count( $post_ids );

    return $count;
}
4
Stephen Harris

Nur als Ergänzung, als Verbesserung, um unterschiedliche Bildgrößen zu berücksichtigen, würde ich Folgendes tun:

$file_name      = pathinfo( $file, PATHINFO_FILENAME );
$file_extension = '.' . pathinfo( $file, PATHINFO_EXTENSION );

Stattdessen einen kombinierten Wert für $file haben.

Und ändern Sie die SQL-Vorbereitung in:

$prepared_sql =
    $wpdb->prepare(
        $sql,
        $id,
        "%src=\"%"
            . like_escape( $file_name )
            . "%"
            . like_escape( $file_extension )
            . "\"%"
    );



Als zweites Additionsbeispiel, das die REGEXP/RLIKE -Funktionalität von MySQL nutzt, werden zusätzlich Bilder abgerufen, die nur mit einem a -Tag verknüpft sind. Außerdem ist dies - im Gegensatz zum ersten Additionsbeispiel - in der Lage, nur die volle, hochgeladene Größe von zu erhalten Das Bild wird unabhängig von der Bildgröße erstellt, wobei zum Beispiel "the-image.jpg" in voller Größe und "the-image-150x150.jpg" in generierter Größe verwendet wird:

$file_name      = pathinfo( $file, PATHINFO_FILENAME );
// beware different syntax
$file_extension = '[[...]]'.pathinfo( $file, PATHINFO_EXTENSION );

$sql = "SELECT {$wpdb->posts}.ID 
    FROM {$wpdb->posts} 
    INNER JOIN {$wpdb->postmeta} 
    ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id) 
    WHERE {$wpdb->posts}.post_type IN ('post', 'page', 'event') 
    AND (({$wpdb->posts}.post_status = 'publish')) 
    AND ( ({$wpdb->postmeta}.meta_key = '_thumbnail_id' 
        AND CAST({$wpdb->postmeta}.meta_value AS CHAR) = '%d') 
        OR ( {$wpdb->posts}.post_content REGEXP %s )
    ) 
    GROUP BY {$wpdb->posts}.ID";

$exp =
    '([[.<.]])' // tag start
        . '(img|a)' // define tag types
        . '.*' // other attributes void
        . '(src|href)' // define anchor(s) attribute
        . '=([[.".]]|[[.\'.]])' // quotes
        . '.*' // path/URL void
        . $file_name
        . '.*' // image size void
        . $file_extension
        . '([[.".]]|[[.\'.]])' // quotes
        . '.*' // other attributes void
        . '([[.>.]])' // tag end
    ;

$prepared_sql =
    $wpdb->prepare(
        $sql,
        $id,
        $exp
    );

$post_ids  = $wpdb->get_results( $prepared_sql );
2
Nicolai