locked ) { $notice = sprintf('A plugin or theme (%1$s) is too late in its attempt to define a taxonomy (%2$s).', $defining_module, $name) . '

' . 'This must be done via the define_taxonomies_rs hook.'; rs_notice($notice); return; } if ( isset($this->members[$name]) ) unset($this->members[$name]); $this->members[$name] = new CR_Taxonomy($name, $defining_module, $label_singular, $label_name, $uses_standard_schema, $default_strict, $args); $this->process( $this->members[$name] ); return $this->members[$name]; } // $tx = reference to CR_Taxonomy object (must pass object so we can call base class function statically) function process( &$tx ) { global $wpdb; $taxonomy = $tx->name; // Apply default / derived properties to Taxonomy definitions if ( $tx->uses_standard_schema ) { $tx->source = 'term'; // default WP schema properties $tx->cols->count = 'count'; $tx->table_term2obj_basename = 'term_relationships'; $tx->table_term2obj_alias = 'tr'; $tx->cols->term2obj_oid = 'object_id'; $tx->cols->term2obj_tid = 'term_taxonomy_id'; if ( empty($tx->edit_url) ) $tx->edit_url = "edit-tags.php?action=edit&taxonomy={$tx->name}&tag_ID=%d"; if ( empty($tx->uri_vars) ) $tx->uri_vars = (object) array( 'id' => 'tag_ID' ); if ( empty($tx->http_post_vars) ) $tx->http_post_vars = (object) array( 'id' => 'tag_ID', 'parent' => 'parent' ); } // term2obj table: add prefix $pfx = ( empty($tx->table_term2obj_noprefix) ) ? $wpdb->prefix : ''; $tx->table_term2obj = $pfx . $tx->table_term2obj_basename; // term2obj taxonomy table: if no alias, set alias property to tablename if ( empty($tx->table_term2obj_alias) ) $tx->table_term2obj_alias = $tx->table_term2obj; // if requires_term property was not explicitly set, default to true for hierarchical terms with default terms enabled and stored if ( ! isset( $tx->requires_term ) ) { if ( $tx->hierarchical && ! empty($tx->default_term_option) && get_option($tx->default_term_option) ) // Author term roles don't work right if requires_term is set false $tx->requires_term = true; else $tx->requires_term = false; } } // standard taxonomy query variables using WP taxonomy schema with objects filtering or term id filtering function standard_query_vars($terms_only = false) { global $wpdb; $arr = array(); if ( $terms_only ) { $tmp = array(); $tmp['table'] = $wpdb->term_taxonomy; $tmp['alias'] = 'tt'; $tmp['as'] = 'AS tt'; $tmp['col_id'] = 'term_taxonomy_id'; $arr['term'] = (object) $tmp; } else { $tmp = array(); $tmp['table'] = $wpdb->term_relationships; $tmp['alias'] = 'tr'; $tmp['as'] = 'AS tr'; $tmp['col_id'] = 'term_taxonomy_id'; $tmp['col_obj_id'] = 'object_id'; $arr['term'] = (object) $tmp; $tmp = array(); $tmp['table'] = $wpdb->posts; $tmp['alias'] = $tmp['table']; $tmp['as'] = ''; $tmp['col_id'] = 'ID'; // posts ID column $arr['obj'] = (object) $tmp; } return (object) $arr; } // standard get_terms query using WP taxonomy schema function standard_query( $taxonomy, $cols, $object_id, $terms_only ) { global $wpdb; $join = $orderby = ''; if ( $object_id || ! $terms_only ) { $join = " INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id"; if ( $object_id ) $join .= " AND tr.object_id = '$object_id'"; } switch ( $cols ) { case COL_ID_RS: $qcols = 'tt.term_id'; break; case COL_TAXONOMY_ID_RS: $qcols = 'tt.term_taxonomy_id'; break; case COL_COUNT_RS: $qcols = 'COUNT(tt.term_id)'; break; default: // COLS_ALL $qcols = 't.*, tt.*'; $orderby = 'ORDER BY t.name'; $join .= " INNER JOIN $wpdb->terms AS t ON t.term_id = tt.term_id"; } $distinct = ( $join ) ? 'DISTINCT ' : ''; return "SELECT {$distinct}$qcols FROM $wpdb->term_taxonomy AS tt $join WHERE 1=1 AND tt.taxonomy = '$taxonomy' $orderby"; } // taxonomy query variables for use with objects filtering or term id filtering function get_terms_query_vars($tx, $terms_only = false) { if ( ! is_object($tx) ) { if ( ! $tx = $this->get($tx) ) return array(); } $arr = array(); if ( ! empty($tx->uses_standard_schema) ) return $this->standard_query_vars($terms_only); require_once( dirname(__FILE__).'/taxonomies-custom_rs.php'); return ScoperCustomTaxonomyHelper::get_terms_query_vars($tx, $terms_only); } // called by Scoper::get_terms function get_terms_query($taxonomy, $cols = COLS_ALL_RS, $object_id = 0, $terms_only = true) { if ( ! isset($this->members[$taxonomy]) ) return; $tx = $this->members[$taxonomy]; if ( ! empty($tx->uses_standard_schema) ) return $this->standard_query($taxonomy, $cols, $object_id, $terms_only); //this is a required child method require_once( dirname(__FILE__).'/taxonomies-custom_rs.php'); return ScoperCustomTaxonomyHelper::get_terms_query($tx, $cols, $object_id, $terms_only); } } class CR_Taxonomy extends AGP_Config_Item { //var $display_name; // use labels->singular_name instead //var $display_name_plural; // use labels->name instead var $labels; var $source; // object reference to a CR_Data_Source (REQUIRED but auto-set for WP taxonomies) var $object_source; // auto-generated upon ScoperConfig::load_config var $requires_term = 0; // must every object type using this category relate every object to at least one term? var $uses_standard_schema = 0; // child classes may set this true if corresponding _Taxonomies class has standard_query_vars, standard_query methods var $cols = array(); // Term to Object schema properties ( i.e. post2cat for WP < 2.3, term_relationships for WP > 2.3 ) var $table_term2obj_basename = ''; // table basename (without prefix) for table relating terms to objects (and taxonomies, if multiple taxonomies are sharing the same DB schema) var $table_term2obj_noprefix = 0; var $table_term2obj; // auto-generated upon ScoperConfig::load_config var $table_term2obj_alias = ''; function CR_Taxonomy($name, $defining_module, $label_singular, $label_name, $uses_standard_schema = true, $requires_term = false, $args = array() ) { $this->AGP_Config_Item($name, $defining_module, $args); $this->labels->name = $label_name; $this->labels->singular_name = $label_singular; $this->uses_standard_schema = $uses_standard_schema; $this->requires_term = $requires_term; } } ?>