Make WordPress Core


Ignore:
Timestamp:
05/27/2007 05:15:18 AM (17 years ago)
Author:
ryan
Message:

Fix object term relationship deletion and count updating.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/taxonomy.php

    r5555 r5556  
    104104}
    105105
     106function wp_delete_object_term_relationships( $object_id, $taxonomies ) {
     107    global $wpdb;
     108
     109    $object_id = (int) $object_id;
     110
     111    if ( !is_array($taxonomies) )
     112        $taxonomies = array($taxonomies);
     113
     114    $terms = get_object_terms($object_id, $taxonomies, 'fields=tt_ids');
     115    $in_terms = "'" . implode("', '", $terms) . "'";
     116    error_log("Terms: " . var_export($terms, true), 0);
     117    $wpdb->query("DELETE FROM $wpdb->term_relationships WHERE object_id = '$object_id' AND term_taxonomy_id IN ($in_terms)");
     118
     119    // Assume all taxonomies have the same object type
     120    $taxonomy = get_taxonomy($taxonomies[0]);
     121    wp_update_term_count($terms, $taxonomy['object_type']);
     122   
     123    // TODO clear the cache
     124}
     125
    106126/**
    107127 * Removes a term from the database.
     
    219239}
    220240
     241function wp_update_term_count( $terms, $object_type ) {
     242    if ( empty($terms) )
     243        return false;
     244
     245    // TODO validate object_type
     246   
     247    if ( !is_array($terms) )
     248        $terms = array($terms);
     249
     250    $terms = array_map('intval', $terms);
     251
     252    do_action("count_${object_type}_terms", $terms);
     253
     254    return true;
     255}
     256
    221257/**
    222258 * Returns the index of a defined term, or 0 (false) if the term doesn't exist.
     
    262298 * @param int $object_id The object to relate to.
    263299 * @param array|int|string $term The slug or id of the term.
    264  * @param array|string $taxonomies The context(s) in which to relate the term to the object.
     300 * @param array|string $taxonomy The context in which to relate the term to the object.
    265301 */
    266 function wp_set_object_terms($object_id, $terms, $taxonomies, $append = false) {
     302function wp_set_object_terms($object_id, $terms, $taxonomy, $append = false) {
    267303    global $wpdb;
    268304
    269305    $object_id = (int) $object_id;
    270306
    271     if ( !is_array($taxonomies) )
    272         $taxonomies = array($taxonomies);
     307    if ( ! is_taxonomy($taxonomy) )
     308        return false;
    273309   
    274310    if ( !is_array($terms) )
     
    276312
    277313    if ( ! $append ) {
    278         $in_taxonomies = "'" . implode("', '", $taxonomies) . "'";
    279         $old_terms = $wpdb->get_col("SELECT tr.term_taxonomy_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($in_taxonomies) AND tr.object_id = '$object_id'");
     314        $old_terms = $wpdb->get_col("SELECT tr.term_taxonomy_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = '$taxonomy' AND tr.object_id = '$object_id'");
    280315        if ( empty($old_terms) )
    281316            $old_terms = array();
     
    283318
    284319    $tt_ids = array();
    285 
    286     foreach ( $taxonomies as $taxonomy ) {
    287         foreach ($terms as $term) {
    288             if ( !$id = is_term($term, $taxonomy) )
    289                 $id = wp_insert_term($term, $taxonomy);
    290             $id = $id['term_taxonomy_id'];
    291             $tt_ids[] = $id;
    292             if ( $wpdb->get_var("SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = '$object_id' AND term_taxonomy_id = '$id'") )
    293                 continue;
    294             $wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id) VALUES ('$object_id', '$id')");
    295             $wpdb->query("UPDATE $wpdb->term_taxonomy SET count = count + 1 WHERE term_taxonomy_id = $id");
    296         }
    297     }
     320    $term_ids = array();
     321
     322    foreach ($terms as $term) {
     323        if ( !$id = is_term($term, $taxonomy) )
     324            $id = wp_insert_term($term, $taxonomy);
     325        $term_ids[] = $id['term_id'];
     326        $id = $id['term_taxonomy_id'];
     327        $tt_ids[] = $id;
     328        if ( $wpdb->get_var("SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = '$object_id' AND term_taxonomy_id = '$id'") )
     329            continue;
     330        $wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id) VALUES ('$object_id', '$id')");
     331    }
     332
     333    $taxonomy_data = get_taxonomy($taxonomy);
     334    wp_update_term_count($tt_ids, $taxonomy_data['object_type']);
    298335
    299336    if ( ! $append ) {
     
    303340            $wpdb->query("DELETE FROM $wpdb->term_relationships WHERE term_taxonomy_id IN ($delete_terms)");
    304341            $wpdb->query("UPDATE $wpdb->term_taxonomy SET count = count - 1 WHERE term_taxonomy_id IN ($delete_terms)");
    305         }
    306     }
     342            wp_update_term_count($delete_terms, $taxonomy_data['object_type']);
     343        }
     344    }
     345
     346    clean_term_cache($term_ids, $taxonomy);
    307347
    308348    return $tt_ids;
     
    315355 * @return array The requested term data.           
    316356 */
    317 function get_object_terms($object_id, $taxonomy, $args = array()) {
    318     global $wpdb;
    319     $taxonomies = ($single_taxonomy = !is_array($taxonomy)) ? array($taxonomy) : $taxonomy;
    320     // TODO cast to int
    321     $object_ids = ($single_object = !is_array($object_id)) ? array($object_id) : $object_id;
     357function get_object_terms($object_ids, $taxonomies, $args = array()) {
     358    global $wpdb;
     359   
     360    if ( !is_array($taxonomies) )
     361        $taxonomies = array($taxonomies);
     362
     363    if ( !is_array($object_ids) )
     364        $object_ids = array($object_ids);
     365    $object_ids = array_map('intval', $object_ids);
    322366
    323367    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'fields' => 'all');
     
    344388    else if ( 'ids' == $fields )
    345389        $taxonomy_data = $wpdb->get_col($query);
     390    else if ( 'tt_ids' == $fields )
     391        $taxonomy_data = $wpdb->get_col("SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id IN ($object_ids) ORDER BY term_taxonomy_id $order");
    346392
    347393    if ( ! $taxonomy_data )
    348394        return array();
    349395
    350     if ($single_taxonomy && $single_object) {
    351         // Just one kind of taxonomy for one object.
    352         return $taxonomy_data;
    353     } else {
    354         foreach ($taxonomy_data as $data) {
    355             if ($single_taxonomy) {
    356                 // Many objects, one taxonomy type.
    357                 $return[$data->object_id][] = $data;
    358             } elseif ($single_object) {
    359                 // One object, many taxonomies.
    360                 $return[$data->taxonomy][] = $data;
    361             } else {
    362                 // Many objects, many taxonomies.
    363                 $return[$data->object_id][$data->taxonomy][] = $data;
    364             }
    365         }
    366         return $return;         
    367     }
     396    return $taxonomy_data;
    368397}
    369398
     
    485514        $children = _get_term_hierarchy($taxonomies[0]);
    486515        if ( ! empty($children) )
    487             $terms = & _get_term_children($child_of, $terms);
     516            $terms = & _get_term_children($child_of, $terms, $taxonomies[0]);
    488517    }
    489518
     
    584613}
    585614
    586 function clean_term_cache($id, $taxonomy) {
    587     wp_cache_delete($id, $taxonomy);
     615function clean_term_cache($ids, $taxonomy) {
     616    if ( !is_array($ids) )
     617        $ids = array($ids);
     618
     619    foreach ( $ids as $id ) {
     620        wp_cache_delete($id, $taxonomy);
     621    }
     622
    588623    wp_cache_delete('all_ids', $taxonomy);
    589624    wp_cache_delete('get', $taxonomy);
     
    599634
    600635    $children = array();
    601     $terms = get_terms('category', 'hide_empty=0&hierarchical=0');
     636    $terms = get_terms($taxonomy, 'hide_empty=0&hierarchical=0');
    602637    foreach ( $terms as $term ) {
    603638        if ( $term->parent > 0 )
     
    609644}
    610645
    611 function &_get_term_children($term_id, $terms) {
     646function &_get_term_children($term_id, $terms, $taxonomy) {
    612647    if ( empty($terms) )
    613648        return array();
    614649
    615650    $term_list = array();
    616     $has_children = _get_term_hierarchy();
     651    $has_children = _get_term_hierarchy($taxonomy);
    617652
    618653    if  ( ( 0 != $term_id ) && ! isset($has_children[$term_id]) )
     
    629664                continue;
    630665
    631             if ( $children = _get_cat_children($term->term_id, $terms) )
     666            if ( $children = _get_term_children($term->term_id, $terms, $taxonomy) )
    632667                $term_list = array_merge($term_list, $children);
    633668        }
     
    637672}
    638673
     674//
     675// Default callbacks
     676//
     677
     678function _update_post_term_count( $terms ) {
     679    global $wpdb;
     680
     681    foreach ( $terms as $term ) {
     682        $count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = '$term'");
     683        $wpdb->query("UPDATE $wpdb->term_taxonomy SET count = '$count' WHERE term_taxonomy_id = '$term'");
     684    }
     685}
     686add_action('count_post_terms', '_update_post_term_count');
     687
     688function _update_link_term_count( $terms ) {
     689    global $wpdb;
     690
     691    foreach ( $terms as $term ) {
     692        $count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = '$term'");
     693        $wpdb->query("UPDATE $wpdb->term_taxonomy SET count = '$count' WHERE term_taxonomy_id = '$term'");
     694    }
     695}
     696add_action('count_link_terms', '_update_link_term_count');
     697
    639698?>
Note: See TracChangeset for help on using the changeset viewer.