web-dev-qa-db-ja.com

添付ファイルが使用されているすべての投稿(任意の投稿タイプ)を取得します。

画像が添付されている投稿の数を数えるのは簡単ではありません - WordPressは単にそれを追跡しません。添付ファイルが最初にアップロードされた投稿を追跡するだけです(必ずしも使用する必要はありません)。

enter image description here

プラグイン

できるだけ早く始めるために、これがプラグインコードです。

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

質問:

添付ファイルが使用されている投稿の数を数える方法 - 最も効率的な方法。

最終的なプラグイン

フルプラグインはここにGistとしてダウンロードすることができます

4
kaiser

セカンドパス 。既知の問題点:

  • キャッシュが必要です(そしてキャッシュは可能な限り整理する必要があります)
  • 投稿タイプはハードコードされています
  • どの投稿ステータスに興味がありますか?

これが関数です:

/**
 * 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

追加として、異なる画像サイズを説明するための改善として、私はそうするでしょう:

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

代わりに$fileの結合値を持ちます。

SQLの準備を次のように変更します。

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



2番目の追加としてMySQLのREGEXP/RLIKE機能を利用する例として、それはさらにaタグでリンクされた画像を取得するだけでなく、これは可能です画像サイズから独立した画像を取得する - 例えば、「the-image.jpg」はフルサイズになり、「the-image-150x150.jpg」は生成されたサイズになります。

$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