Разница между получить категорию, получить срок и получить категории
get_category
возвращает null, но использование get term_by
или get_categories()
не является. Почему?
Я создал термин под названием categorycourses. У меня есть сообщение, связанное с категорией курсов Лидчепинг (vardump1),
Вардумп1
object(stdClass)[2525]
public 'term_id' => &int 5
public 'name' => &string 'Lidköping' (length=10)
public 'slug' => &string 'kurser_lidkoping' (length=16)
public 'term_group' => int 0
public 'term_taxonomy_id' => int 105
public 'taxonomy' => string 'category' (length=8)
public 'description' => &string '' (length=0)
public 'parent' => &int 0
public 'count' => &int 1
public 'filter' => string 'raw' (length=3)
public 'cat_ID' => &int 5
public 'category_count' => &int 1
public 'category_description' => &string '' (length=0)
public 'cat_name' => &string 'Lidköping' (length=10)
public 'category_nicename' => &string 'kurser_lidkoping' (length=16)
public 'category_parent' => &int 0
Вардумп2
null
Вардумп3
object(stdClass)[2525]
public 'term_id' => int 105
public 'name' => string 'Skara' (length=5)
public 'slug' => string 'kurser_skara' (length=12)
public 'term_group' => int 0
public 'term_taxonomy_id' => int 108
public 'taxonomy' => string 'categorycourses' (length=15)
public 'description' => string 'skara' (length=5)
public 'parent' => int 0
public 'count' => int 1
public 'filter' => string 'raw' (length=3)
Я вижу, что таксономия, возвращаемая get_category
, является "категорией", в то время как таксономия, возвращаемая get_category
, является "категорией".
Вот код, который я использую:
//Vardump1
$location = get_category(skovdeLocationId); //another location id
var_dump($location);
//Vardump2
$location = get_category(skaraLocationId, 'categorycourses');
var_dump($location); //returns null (with or without taxonomy defined)
//Vardump3
$location = get_term_by( 'id', skovdeLocationId, 'categorycourses' );
var_dump($location);
Но
get_categories(array(
'taxonomy' =>'categorycourses',
'include' => skaraLocationId
));
Возвращает термин правильно (как vardump1, но где местоположение = skaraLocationId)
Почему? Не должны ли get_categories и get_category быть одинаковыми? (или get_termby)
2 answers
Чтобы полностью понять разницу между get_categories()
, get_category()
и get_term_by()
, вам нужно взглянуть на то, как построены эти функции.
get_categories($args)
как следует из названия, получите список всех категорий, созданных на сайте. Эту функцию можно найти в "wp-includes/category.php " строки с 39 по 66
39 function get_categories( $args = '' ) {
40 $defaults = array( 'taxonomy' => 'category' );
41 $args = wp_parse_args( $args, $defaults );
42
43 $taxonomy = $args['taxonomy'];
44 /**
45 * Filter the taxonomy used to retrieve terms when calling get_categories().
46 *
47 * @since 2.7.0
48 *
49 * @param string $taxonomy Taxonomy to retrieve terms from.
50 * @param array $args An array of arguments. @see get_terms()
51 */
52 $taxonomy = apply_filters( 'get_categories_taxonomy', $taxonomy, $args );
53
54 // Back compat
55 if ( isset($args['type']) && 'link' == $args['type'] ) {
56 _deprecated_argument( __FUNCTION__, '3.0', '' );
57 $taxonomy = $args['taxonomy'] = 'link_category';
58 }
59
60 $categories = (array) get_terms( $taxonomy, $args );
61
62 foreach ( array_keys( $categories ) as $k )
63 _make_cat_compat( $categories[$k] );
64
65 return $categories;
66 }
Как видно из строки 40, категория используется в качестве таксономии по умолчанию, поэтому в списке будут возвращены только категории категории
get_category( $category, $output, $filter )
извлекает только данные категории для определенной заданной категории. Эту функцию можно найти в "wp-includes/category.php " строки с 90 по 99
90 function get_category( $category, $output = OBJECT, $filter = 'raw' ) {
91 $category = get_term( $category, 'category', $output, $filter );
92
93 if ( is_wp_error( $category ) )
94 return $category;
95
96 _make_cat_compat( $category );
97
98 return $category;
99 }
Из строки 91 вы можете видеть, что get_category()
использует в качестве термина только категорию, поэтому будет возвращена только категория, без терминов.
get_term_by( $field, $value, $taxonomy, $output, $filter )
получит все данные по срокам по полю срока и данным. Эту функцию можно найти "wp-includes/taxonomy.php " в строках с 1028 по 1076
1028 function get_term_by($field, $value, $taxonomy, $output = OBJECT, $filter = 'raw') {
1029 global $wpdb;
1030
1031 if ( ! taxonomy_exists($taxonomy) )
1032 return false;
1033
1034 if ( 'slug' == $field ) {
1035 $field = 't.slug';
1036 $value = sanitize_title($value);
1037 if ( empty($value) )
1038 return false;
1039 } else if ( 'name' == $field ) {
1040 // Assume already escaped
1041 $value = wp_unslash($value);
1042 $field = 't.name';
1043 } else if ( 'term_taxonomy_id' == $field ) {
1044 $value = (int) $value;
1045 $field = 'tt.term_taxonomy_id';
1046 } else {
1047 $term = get_term( (int) $value, $taxonomy, $output, $filter);
1048 if ( is_wp_error( $term ) )
1049 $term = false;
1050 return $term;
1051 }
1052
1053 $term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND $field = %s LIMIT 1", $taxonomy, $value) );
1054 if ( !$term )
1055 return false;
1056
1057 wp_cache_add($term->term_id, $term, $taxonomy);
1058
1059 /** This filter is documented in wp-includes/taxonomy.php */
1060 $term = apply_filters( 'get_term', $term, $taxonomy );
1061
1062 /** This filter is documented in wp-includes/taxonomy.php */
1063 $term = apply_filters( "get_$taxonomy", $term, $taxonomy );
1064
1065 $term = sanitize_term($term, $taxonomy, $filter);
1066
1067 if ( $output == OBJECT ) {
1068 return $term;
1069 } elseif ( $output == ARRAY_A ) {
1070 return get_object_vars($term);
1071 } elseif ( $output == ARRAY_N ) {
1072 return array_values(get_object_vars($term));
1073 } else {
1074 return $term;
1075 }
1076 }
В строке 1047, вы можете видеть, что таксономия может быть указана пользователем и не закодирована, чем две другие функции, упомянутые ранее
Для вашей же пользы вам следует изучить ссылки, которые я предоставил. Это вам очень поможет, если вы это сделаете.
Прежде всего get_categories
извлекает список категорий, и его не следует использовать для извлечения одной категории по идентификатору.
Разница между get_term_by
и get_category
заключается в том, что get_term_by
позволяет указать таксономию, где get_category
всегда использует таксономию category
. Даже если имя функции предполагает иное, get_categories
также позволяет извлекать данные из других таксономий, кроме category
.
Таким образом, get_categories
и get_category
не всегда должны возвращать один и тот же термин (даже если он находится в массиве для прежний), так как get_category
позволяет вам получать только термины таксономии category
, а get_categories
также поддерживает другие таксономии. То же самое относится и к get_term_by
.