Разница между получить категорию, получить срок и получить категории


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)

Author: Pieter Goosen, 2014-06-12

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, вы можете видеть, что таксономия может быть указана пользователем и не закодирована, чем две другие функции, упомянутые ранее

Для вашей же пользы вам следует изучить ссылки, которые я предоставил. Это вам очень поможет, если вы это сделаете.

 2
Author: Pieter Goosen, 2014-06-12 14:09:03

Прежде всего 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.

 2
Author: engelen, 2014-06-12 08:12:41