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

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 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 );
                }
            }

    }

}

Method 2

You use $post->ID to get the image data and then you use $post_ID to save your term data. I don’t think $post_ID is defined.

I usually take the post ID from the function call
Maybe it should be:
function add_post_camera_category($post_ID) {

http://codex.wordpress.org/Plugin_API/Action_Reference/save_post


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x