-
-
Save franz-josef-kaiser/086d754ac492f49b78b8 to your computer and use it in GitHub Desktop.
<?php | |
namespace WCM; | |
/** | |
* Plugin Name: (WCM) Media Count | |
* Description: Adds a column to the media admin list table to show the count of posts | |
* License: MIT | |
*/ | |
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']} × {$meta['height']}"; | |
// Audio | |
isset( $meta['bitrate'] ) | |
AND print "{$meta['length_formatted']} min"; | |
break; | |
case 'count' : | |
$posts = \WCM\wcm_get_att_use_count( $id ); | |
foreach ( $posts as $post ) | |
edit_post_link( | |
$post->post_title, | |
'<strong>', | |
'</strong><br>', | |
$post->ID | |
); | |
break; | |
} | |
}, 10, 2 ); | |
/** | |
* Retrieve an array of IDs and post titles | |
* of posts where the image is in use | |
* (feat. image and in the post content) | |
* @author SQL Query Stephen Harris | |
* @license CC-BY-SA 3.0 | |
* @param int $id | |
* @return array | |
*/ | |
function wcm_get_att_use_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 | |
$name = pathinfo( $file, PATHINFO_FILENAME ); | |
$ext = pathinfo( $file, PATHINFO_EXTENSION ); | |
$sql = <<<SQL | |
select distinct {$wpdb->posts}.ID, {$wpdb->posts}.post_title | |
from {$wpdb->posts} | |
inner join {$wpdb->postmeta} | |
on {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id | |
where | |
post_type not in ( 'attachment', 'revision', 'nav_menu_item' ) | |
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 | |
SQL; | |
return $wpdb->get_results( $wpdb->prepare( | |
$sql, | |
$id, | |
"%src=\"%" | |
. like_escape( $name ) | |
. "%" | |
. like_escape( $ext ) | |
. "\"%" | |
) ); | |
} |
@stephenharris Do you mean the Regex statement by @ialocin ?
About the post meta - yes that might be a good idea. Still keeping the post IDs as post meta of the attachment might be an option as well.
@stephenharris @franz-josef-kaiser I think use a post meta on attachment post is a better approach. Only problem there is that on plugin installation, it should check all already existent posts or count will be not available (or 0) for them. Other issues I see here are:
- probably private posts should be added in the SQL query, because they are published, just password protected
- a filter should be added in the SQL query to allow a better control for custom post types, and/or probably exclude all post types registered as non-public
@franz-josef-kaiser kind of. Except not as part of an SQL statement, but just regex $post->post_content
when the content is updated. You could then store any image files (or better still, look-up the image ID and store that). Then you'll have a reference of all images included/associated with the post in post meta and query by that.
It makes caching much easier as you can detect when an image is added/removed and regenerate the cache then.
@Giuseppe-Mazzapica agreed. I got lazy and just hard-coded stuff :)
As mentioned in WPSE chat. This is hard to cache. I'm starting it might be better to check a post's content for images and store any found as post meta whenever the post content is updated. Then you can tell which images have bee added/removed and clear the cache accordingly.
There's an improved LIKE statement here http://wordpress.stackexchange.com/questions/154324/get-all-posts-of-any-post-type-an-attachment-is-used-in/154325#154325 - which itself can easily be improved to reduce false positives.