web-dev-qa-db-fra.com

get_terms renvoie des erreurs

Salut quand j'essaie de get_terms(); dans les options de thème via ce code

$catalogs_terms = get_terms( 'catalogs' );
   $mycatalogs = array( -1 => 'Select a catalog' );
   if ( $catalogs_terms ) {
      foreach ( $catalogs_terms as $catalog_term ) {
         $mycatalogs[$catalog_term->term_id] = $catalog_term->name;
      }
   }

retourne vide mais ce code fonctionne bien chaque fois dans les pages etc. Quand j'essaie de print_r( $catalogs_terms ) la sortie j'obtiens des erreurs

Array ( [errors] => Array ( [invalid_taxonomy] => Array ( [0] => Invalid Taxonomy ) ) [error_data] => Array ( ) )

je ne comprends pas où je me trompe? ma fonction pour la taxonomie de registre

    add_action( 'init', 'my_taxonomies', 0 );

function my_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name' => _x( 'Catalogs', 'taxonomy general name' ),
        'singular_name' => _x( 'Catalog', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Catalogs', 'mytextdomain' ),
        'all_items' => __( 'All Catalogs', 'mytextdomain' ),
        'parent_item' => __( 'Parent Catalog', 'mytextdomain' ),
        'parent_item_colon' => __( 'Parent Catalog:', 'mytextdomain' ),
        'edit_item' => __( 'Edit Catalog', 'mytextdomain' ), 
        'update_item' => __( 'Update Catalog', 'mytextdomain' ),
        'add_new_item' => __( 'Add New Catalog', 'mytextdomain' ),
        'new_item_name' => __( 'New Catalog Name', 'mytextdomain' ),
        'menu_name' => __( 'Catalogs', 'mytextdomain' ),
    );  

    // register catalogs hierarchical (like categories)
    register_taxonomy( 'catalogs',
        array( 'news' ),
        array( 'hierarchical' => true,
            'labels' => $labels,
            'show_ui' => true,
            'public' => true,
            'query_var' => true,
            'rewrite' => array( 'slug' => 'catalogs' )
        )
    );
}
1
Anjum

Comme je le mentionnais précédemment, il s’agit d’un cas d’extraction de mots avant l’enregistrement de la taxonomie.

L'action init se produit après que le fichier de fonctions du thème a été inclus. Par conséquent, si vous recherchez des termes directement dans le fichier de fonctions, vous le faites avant qu'ils aient été réellement enregistrés.

Voici une partie du code de wp-settings.php qui inclut les fonctions de thème et effectue l'action init.

// Load the functions for the active theme, for both parent and child theme if applicable.
if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
    include( STYLESHEETPATH . '/functions.php' );
if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
    include( TEMPLATEPATH . '/functions.php' );

do_action( 'after_setup_theme' );

// Load any template functions the theme supports.
require_if_theme_supports( 'post-thumbnails', ABSPATH . WPINC . '/post-thumbnail-template.php' );

register_shutdown_function( 'shutdown_action_hook' );

// Set up current user.
$wp->init();

/**
 * Most of WP is loaded at this stage, and the user is authenticated. WP continues
 * to load on the init hook that follows (e.g. widgets), and many plugins instantiate
 * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.).
 *
 * If you wish to plug an action once WP is loaded, use the wp_loaded hook below.
 */
do_action( 'init' );

Comme vous pouvez le constater, l'action init ne se déclenche qu'après que le fichier de fonctions de thème a été inclus. Par conséquent, toute récupération de terme doit avoir lieu après init. Cependant, je ne peux pas vraiment vous conseiller car vous ne m'avez montré qu'une partie de votre code. Je n'ai donc aucune idée du contexte dans lequel vous essayez d'utiliser le terme fonction, mais il peut certainement 'ne pas être appelé directement dans le fichier de fonctions (en dehors d'un rappel relié à une action/un filtre spécifique car le code sera exécuté bientôt).

Espérons que ce qui précède illustre suffisamment le problème pour vous .. :)

Remarque additionnelle:
Il manque une variable dans l'instruction globale de cette fonction (vous verriez PHP si le débogage est activé).

function news_updated_messages( $messages ) {
    global $post;

Cela devrait se lire ..

function news_updated_messages( $messages ) {
    global $post, $post_ID;

.. parce que le code à l'intérieur de cette fonction fait référence à cette variable, mais que la variable n'a pas de portée à l'intérieur de la fonction, la modification suggérée ci-dessus résoudra ce problème.

Suivi n ° 1

Lorsque vous créez un plugin ou une page de thème, vous devez d’abord configurer/enregistrer cette page, c’est généralement le cas.

add_action('admin_menu', 'my_theme_menu');

function my_theme_menu() {
    add_theme_page( 'Theme Settings', 'Theme Settings', 'manage_options', 'my-unique-identifier', 'my_theme_settings' );
}
function my_theme_settings() {

    // Code to display/handle theme options would be here
    // You get_terms() call should work inside this function just fine

}

Si la page de thème est créée différemment,est spécifique au thème Premium que vous utilisez, je ne peux donc pas vraiment vous aider, car ils ont tendance à utiliser un cadre totalement différent des thèmes WordPress classiques.

7
t31os

Si vous ne voulez pas perdre votre temps avec Wordpress, vous pouvez utiliser une fonction de remplacement comme celle-ci pour saisir la taxonomie à tout moment.

function custom_get_terms($term) {
 global $wpdb;

 $out = array();

 $a = $wpdb->get_results($wpdb->prepare("SELECT t.name,t.slug,t.term_group,x.term_taxonomy_id,x.term_id,x.taxonomy,x.description,x.parent,x.count FROM {$wpdb->prefix}term_taxonomy x LEFT JOIN {$wpdb->prefix}terms t ON (t.term_id = x.term_id) WHERE x.taxonomy=%s;",$term));

 foreach ($a as $b) {
  $obj = new stdClass();
  $obj->term_id = $b->term_id;
  $obj->name = $b->name;
  $obj->slug = $b->slug;
  $obj->term_group = $b->term_group;
  $obj->term_taxonomy_id = $b->term_taxonomy_id;
  $obj->taxonomy = $b->taxonomy;
  $obj->description = $b->description;
  $obj->parent = $b->parent;
  $obj->count = $b->count;
  $out[] = $obj;
 }

 return $out;
}
2
Exit