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.
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
.