First, some comments on your code:
- the globals
$post
and$wpdb
are not needed, in any case you can declare them asglobal $post, $wpdb;
- I don’t understand your use of this conditional
if (is_null($imgID))
- you’re using
get_term_by
with “slug”, but I guess it’s better to do it by “name”
The following is a working code, but I’m not sure if there are any flaws in it. As I was not able to debug the save_post
using FirePHP, I did a dirty trick dumping the vars inside a custom field: update_post_meta($post_ID, 'cf_debug_info', print_r($imgmeta,true));
.
add_action('save_post', 'wpse_53549_add_post_camera_category', 10, 2);
function wpse_53549_add_post_camera_category($post_ID, $post) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
$images = get_children( array(
'post_parent' => $post_ID,
'post_type' => 'attachment',
'numberposts' => 1,
'post_mime_type' => 'image',
'orderby' => 'ID',
'order' => 'ASC'
));
if ( $images )
{
$image = array_shift( $images );
$imgID = $image->ID;
}
if ( !$imgID )
return;
$imgmeta = wp_get_attachment_metadata($imgID);
if ( $imgmeta )
{
// this info may be useful when checking for has_term
// $defaultcat = get_option('default_category');
$camera = ($imgmeta['image_meta']['camera']) ? $imgmeta['image_meta']['camera'] : false;
if ( $camera )
// Add to custom category
if( !has_term( $camera, 'category', $post_ID ) )
{
$category = get_term_by( 'name', $camera, 'category' );
if ( $category )
{
$cat = array( $category->slug );
// the last parameter sets if the term must be appended or overwrite the previous
wp_set_object_terms( $post_ID, $cat, 'category', true );
}
else
{
$id = wp_create_category( $camera );
$new_cat = get_term_by( 'id', $id, 'category' );
wp_set_object_terms( $post_ID, $new_cat->slug, 'category', true );
}
}
}
}