/** * Get the default category ID. * * NOTE: This is also the callback for the `default_option_{name}` filter @see get_option(). * * NOTE: Uses the @see get_option() and @see update_option() functions instead of the @see cnSettingsAPI() * because it is used in places where the cnSettingsAPI() has not yet been fully initialized. * * @access public * @since 8.3.3 * @static * * @uses remove_filter() * @uses get_option() * @uses cnTerm::exists() * @uses cnTerm::getBy() * @uses cnTerm::insert() * @uses update_option() * @uses is_wp_error() * @uses add_filter() * * @return int */ public static function getDefaultCategoryID() { $id = 0; // Remove filter to prevent an infinite loop. remove_filter('default_option_cn_default_category', array(__CLASS__, 'getDefaultCategoryID')); // Use get_option() rather than cnSettingsAPI::get() because the class may not yet be initialized. $category = get_option('connections_category'); // Check to ensure the default category ID is saved in the options table before returning it. if (FALSE === $category || !isset($category['default']) || empty($category['default'])) { // If there was no default category set, check for the "Uncategorized" category. If it exists return its // `id` and if it does not, then create it an return the `id`. if (cnTerm::exists('uncategorized', 'category')) { $category = cnTerm::getBy('slug', 'uncategorized', 'category', ARRAY_A); // Ensure nothing went wrong when checking for the "Uncategorized" category. // If not, save the `id` in the options table. if (FALSE !== $category) { $id = $category['term_id']; // Use update_option() rather than cnSettingsAPI::set() because the class may not yet be initialized. update_option('connections_category', array('default' => $id)); } } else { $category = cnTerm::insert(__('Uncategorized', 'connections'), 'category'); // Ensure nothing went wrong when inserting the "Uncategorized" category. // If not, save the `id` in the options table. if (!is_wp_error($category)) { $id = $category['term_id']; // Use update_option() rather than cnSettingsAPI::set() because the class may not yet be initialized. update_option('connections_category', array('default' => $id)); } } } else { $id = $category['default']; } // Add the filter back. add_filter('default_option_cn_default_category', array(__CLASS__, 'getDefaultCategoryID')); /** * Allows the opportunity to change the default category. * * @since 8.3.3 * * @param int $id The default category ID. */ return apply_filters('cn_default_category', $id); }
/** * Update term based on arguments provided. * * The $args will indiscriminately override all values with the same field name. * Care must be taken to not override important information needed to update or the * update will fail (or perhaps create a new term, neither would be acceptable). * * Defaults will set 'alias_of', 'description', 'parent', and 'slug' if not * defined in $args already. * * 'alias_of' will create a term group, if it does not already exist, and update * it for the $term. * * If the 'slug' argument in $args is missing, then the 'name' in $args will be * used. It should also be noted that if you set 'slug' and it isn't unique then * a WP_Error will be passed back. If you don't pass any slug, then a unique one * will be created for you. * * For what can be overrode in $args, check the term scheme can contain and stay * away from the term keys. * * NOTE: This is the Connections equivalent of @see wp_update_term() in WordPress core ../wp-includes/taxonomy.php * * Actions: * cn_edit_terms * Passes: (int) $term_id, (string) $taxonomy * * cn_edited_terms * Passes: (int) $term_id, (string) $taxonomy * * cn_edit_term_taxonomy * Passes: (int) $term_taxonomy_id, (string) $taxonomy * * cn_edited_term_taxonomy * Passes: (int) $term_taxonomy_id, (string) $taxonomy * * cn_edit_term * Passes: (int) $term_id, (int) $taxonomy_term_id, (string) $taxonomy * * cn_edit_$taxonomy * Passes: (int) $taxonomy_term_id, (string) $taxonomy * * cn_edited_term * Passes: (int) $term_id, (int) $taxonomy_term_id, (string) $taxonomy * * cn_edited_$taxonomy * Passes: (int) $taxonomy_term_id, (string) $taxonomy * * Filters: * * cn_update_term_parent * Passes: (int) $parent_term_id, (int) $term_id, (string) $taxonomy, (array) $parsed_args, (array) $args * Returns: $parent_term_id * * cn_term_id_filter * Passes: (int) $term_id, (int) $taxonomy_term_id * Return: $term_id * * @access public * @since 8.1.6 * @static * * @global wpdb $wpdb * * @param int $term_id The ID of the term * @param string $taxonomy The context in which to relate the term to the object. * @param array $args { * Optional. Overwrite term field values. * * @type string 'alias_of' Slug of the term to make this term an alias of. * Default: empty string. * Accepts a term slug. * @type string 'description' The term description. * Default: empty string. * @type int 'parent' The id of the parent term. * Default: 0. * @type string 'slug' The term slug to use. * Default: empty string. * } * * @return array|WP_Error Returns Term ID and Taxonomy Term ID or an instance of the WP_Error object. */ public static function update($term_id, $taxonomy, $args = array()) { global $wpdb; //@todo Add taxonomy check. //if ( ! taxonomy_exists($taxonomy) ) // return new WP_Error('invalid_taxonomy', __('Invalid taxonomy')); $term_id = (int) $term_id; // First, get all of the original args $term = self::get($term_id, $taxonomy); if (is_wp_error($term)) { return $term; } if (!$term) { return new WP_Error('invalid_term', __('Empty Term', 'connections')); } $term = (array) $term->data; // Escape data pulled from DB. $term = wp_slash($term); // Merge old and new args with new args overwriting old ones. $args = array_merge($term, $args); $defaults = array('alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => ''); $args = wp_parse_args($args, $defaults); $args = sanitize_term($args, 'cn_' . $taxonomy, 'db'); $parsed_args = $args; // expected_slashed ($name) $name = wp_unslash($args['name']); $description = wp_unslash($args['description']); $parsed_args['name'] = $name; $parsed_args['description'] = $description; if ('' == trim($name)) { return new WP_Error('empty_term_name', __('A name is required for this term', 'connections')); } if (0 < $parsed_args['parent'] && !cnTerm::exists((int) $parsed_args['parent'])) { return new WP_Error('missing_parent', __('Parent term does not exist.', 'connections')); } $empty_slug = FALSE; if (empty($args['slug'])) { $empty_slug = TRUE; $slug = sanitize_title($name); } else { $slug = $args['slug']; } $parsed_args['slug'] = $slug; $term_group = isset($parsed_args['term_group']) ? $parsed_args['term_group'] : 0; if ($args['alias_of']) { $alias = cnTerm::getBy('slug', $args['alias_of'], $taxonomy); if (!empty($alias->term_group)) { // The alias we want is already in a group, so let's use that one. $term_group = $alias->term_group; } elseif (!empty($alias->term_id)) { /* * The alias is not in a group, so we create a new one and add the alias to it. */ $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM {$wpdb->terms}") + 1; cnTerm::update($alias->term_id, $taxonomy, array('term_group' => $term_group)); } $parsed_args['term_group'] = $term_group; } /** * Filter the term parent. * * Hook to this filter to see if it will cause a hierarchy loop. * * @since 8.1.6 * * @param int $parent ID of the parent term. * @param int $term_id Term ID. * @param string $taxonomy Taxonomy slug. * @param array $parsed_args An array of potentially altered update arguments for the given term. * @param array $args An array of update arguments for the given term. */ $parent = apply_filters('cn_update_term_parent', $args['parent'], $term_id, $taxonomy, $parsed_args, $args); // Check for duplicate slug $duplicate = self::getBy('slug', $slug, $taxonomy); if ($duplicate && $duplicate->term_id != $term_id) { // If an empty slug was passed or the parent changed, reset the slug to something unique. // Otherwise, bail. if ($empty_slug || $parent != $term['parent']) { $slug = self::unique_slug($slug, (object) $args); } else { return new WP_Error('duplicate_term_slug', sprintf(__('The slug “%s” is already in use by another term', 'connections'), $slug)); } } $tt_id = (int) $wpdb->get_var($wpdb->prepare("SELECT tt.term_taxonomy_id FROM " . CN_TERM_TAXONOMY_TABLE . " AS tt INNER JOIN " . CN_TERMS_TABLE . " AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id)); // Check whether this is a shared term that needs splitting. //$_term_id = _split_shared_term( $term_id, $tt_id ); //if ( ! is_wp_error( $_term_id ) ) { // $term_id = $_term_id; //} /** * Fires immediately before the given terms are edited. * * @since 8.1.6 * * @param int $term_id Term ID. * @param string $taxonomy Taxonomy slug. */ do_action('cn_edit_terms', $term_id, $taxonomy); $wpdb->update(CN_TERMS_TABLE, compact('name', 'slug', 'term_group'), compact('term_id')); if (empty($slug)) { $slug = sanitize_title($name, $term_id); $wpdb->update(CN_TERMS_TABLE, compact('slug'), compact('term_id')); } /** * Fires immediately after the given terms are edited. * * @since 8.1.6 * * @param int $term_id Term ID * @param string $taxonomy Taxonomy slug. */ do_action('cn_edited_terms', $term_id, $taxonomy); /** * Fires immediate before a term-taxonomy relationship is updated. * * @since 8.1.6 * * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ do_action('cn_edit_term_taxonomy', $tt_id, $taxonomy); $wpdb->update(CN_TERM_TAXONOMY_TABLE, compact('term_id', 'taxonomy', 'description', 'parent'), array('term_taxonomy_id' => $tt_id)); /** * Fires immediately after a term-taxonomy relationship is updated. * * @since 8.1.6 * * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ do_action('cn_edited_term_taxonomy', $tt_id, $taxonomy); // Clean the relationship caches for all object types using this term $objects = $wpdb->get_col($wpdb->prepare("SELECT entry_id FROM " . CN_TERM_RELATIONSHIP_TABLE . " WHERE term_taxonomy_id = %d", $tt_id)); //@todo implement the following block of code. //$tax_object = get_taxonomy( $taxonomy ); //foreach ( $tax_object->object_type as $object_type ) { // self::cleanRelationshipCache( $objects, $object_type ); self::cleanRelationshipCache($objects, $taxonomy); // Clean the entry/term relationships directly until get_taxonomy() is implemented. //} /** * Fires after a term has been updated, but before the term cache has been cleaned. * * @since 8.1.6 * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ do_action("cn_edit_term", $term_id, $tt_id, $taxonomy); /** * Fires after a term in a specific taxonomy has been updated, but before the term * cache has been cleaned. * * The dynamic portion of the hook name, $taxonomy, refers to the taxonomy slug. * * @since 8.1.6 * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. */ do_action("cn_edit_{$taxonomy}", $term_id, $tt_id); /** @see cnTerm::insert() */ $term_id = apply_filters('cn_term_id_filter', $term_id, $tt_id); self::cleanCache($term_id, $taxonomy); /** * Fires after a term has been updated, and the term cache has been cleaned. * * @since 8.1.6 * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. * @param string $taxonomy Taxonomy slug. */ do_action("cn_edited_term", $term_id, $tt_id, $taxonomy); /** * Fires after a term for a specific taxonomy has been updated, and the term * cache has been cleaned. * * The dynamic portion of the hook name, $taxonomy, refers to the taxonomy slug. * * @since 8.1.6 * * @param int $term_id Term ID. * @param int $tt_id Term taxonomy ID. */ do_action("cn_edited_{$taxonomy}", $term_id, $tt_id); return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id); }