web-dev-qa-db-fra.com

Différence entre get_category, get_term_by et get_categories

get_category renvoie null mais utiliser get term_by ou get_categories() ne l’est pas. Pourquoi?

J'ai créé un terme appelé categorycourses. J'ai un article en rapport avec coursecategory Lidköping (vardump1),

vardump1

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

vardump2

null

vardump3

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)

Je vois que la taxonomie retournée par get_category est 'catégorie', alors que la taxonomie renvoyée par get_category est 'categorycourses'.

Voici le code que j'utilise:

//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);

Mais

get_categories(array(
        'taxonomy'  =>'categorycourses',
        'include'   => skaraLocationId
        ));

renvoie correctement le terme (comme vardump1 mais où location = skaraLocationId)

Pourquoi? Les catégories get_categories et get_category ne devraient-elles pas être identiques? (ou get_termby)

Pour bien comprendre la différence entre get_categories() , get_category() et get_term_by() , vous devez examiner comment ces fonctions sont construites.

get_categories($args) comme son nom l'indique, obtenez une liste de toutes les catégories créées sur le site. Cette fonction peut être trouvée dans "wp-includes/category.php" lignes 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    }

Comme vous pouvez le constater à la ligne 40, la catégorie est utilisée comme taxonomie par défaut. Seules les catégories sont renvoyées dans la liste des catégories.

get_category( $category, $output, $filter ) récupère uniquement les données de catégorie pour une catégorie donnée. Cette fonction peut être trouvée dans "wp-includes/category.php" lignes 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    }

À la ligne 91, vous pouvez voir que get_category() utilise uniquement la catégorie en tant que terme. Par conséquent, seule la catégorie sera renvoyée, pas de termes.

get_term_by( $field, $value, $taxonomy, $output, $filter ) obtiendra toutes les données de terme par champ de terme et données. Cette fonction peut être trouvée "wp-includes/taxonomy.php" dans les lignes 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   }

À la ligne 1047, vous pouvez voir que la taxonomie peut être spécifiée par l'utilisateur et qu'elle n'est pas codée plus que les deux autres fonctions mentionnées précédemment.

Pour votre propre bénéfice, vous devriez creuser dans les liens que j'ai fournis. Vous aidera beaucoup si vous le faites.

2
Pieter Goosen

Tout d'abord, get_categories récupère une liste de catégories et ne devrait pas être utilisé pour récupérer une seule catégorie par ID.

La différence entre get_term_by et get_category est que get_term_by vous permet de spécifier une taxonomie, où get_category utilise toujours la taxonomie category. Même si le nom de la fonction suggère le contraire, get_categories vous permet également d'extraire d'autres taxonomies que category.

Ainsi, get_categories et get_category ne devraient pas toujours renvoyer le même terme (même s'il fait partie d'un tableau pour l'ancien), car get_category vous permet uniquement d'obtenir les termes de la taxonomie category, et get_categories prend également en charge d'autres taxonomies. La même chose vaut pour get_term_by.

2
engelen