Create new category upon save based on post information

After finding a couple of leads on how to do this, I’m coming up blank. What I am trying to accomplish is to add the post to a new category based on camera name. If the category doesn’t exist, then to create it and add.

Essentially what I have below grabs the attachment meta information and saves the camera information into $camera. From there, it kind of falls apart.

function add_post_camera_category() {
global $post;
global $wpdb;
    // Load array with attachment information
    if (is_null($imgID)) {
        $images = get_children(array(
            'post_parent' => $post->ID,
            'post_type' => 'attachment',
            'numberposts' => 1,
            'post_mime_type' => 'image',
            'orderby' => 'ID',
            'order' => 'ASC'
            ));
        if ($images) {
            foreach ($images as $image) {
                $imgID = $image->ID;
            }
        }
    }

    $imgmeta = wp_get_attachment_metadata($imgID);
if ($imgmeta)
{
    if ($imgmeta['image_meta']['camera'])
        $camera = $imgmeta['image_meta']['camera'];

            // Add to custom category
        if(!has_term('','category',$post_ID)){
            $category = get_term_by( 'slug', $camera, 'category' );
            $cat = array($category->slug);
            wp_set_object_terms($post_ID, $cat, 'category');
        }

}

}
add_action('save_post', 'add_post_camera_category');

Related posts

Leave a Reply

2 comments

  1. First, some comments on your code:

    • the globals $post and $wpdb are not needed, in any case you can declare them as global $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 );
                    }
                }
    
        }
    
    }