web-dev-qa-db-ja.com

get_termsがエラーを返す

こんにちは私はこのコードを介してテーマオプションでget_terms();を試みるとき

$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;
      }
   }

私はprint_r( $catalogs_terms )出力しようとすると空を返しますが、このコードはページのどこにでもうまく動いています。

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

どこが悪いのかわかりませんか?登録分類法のための私の機能

    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

私が前に言及したように、それは分類学が登録された前に起こるあなたの用語フェッチのケースです。

Initアクションはテーマのfunctionsファイルがインクルードされた後に発生するので、functionsファイル内で直接用語を探しているのであれば、実際にそれらが登録される前にそうしています。

これは、テーマ関数を含み、initアクションを実行するwp-settings.phpのコードの一部です。

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

ご覧のとおり、initアクションはテーマ関数ファイルがインクルードされるまで起動しません。したがって、用語検索はinitの後に行わなければなりません。コードの一部しか表示されていないので、これ以上アドバイスすることはできません。そのため、関数という用語を使用しようとしているコンテキストについてはあまりわかりません。 (コードはすぐに実行されるため、特定のアクション/フィルタにフックされたコールバックの外側で)関数ファイル内で直接呼び出すことはできません。

うまくいけば、上記はあなたのために十分な問題を説明しています.. :)

追加の注意事項:
この関数は、グローバルステートメントからvarがありません(デバッグがオンになっている場合はPHPという通知が表示されます)。

function news_updated_messages( $messages ) {
    global $post;

それを読む必要があります..

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

..その関数内のコードはそのvarを参照していますが、その変数は関数内にスコープを持っていないので、私が上記で提案した変更はそれを修正します。

フォローアップ#1

プラグインやテーマページを作成するときは、まずそのページを設定/登録する必要があります。これは通常、次のように行われます。

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

}

テーマページの作成方法が異なる場合、使用しているプレミアムテーマに固有のものでは、通常のWordPressとはまったく異なるフレームワークを使用する傾向があるため、あまり役に立ちません。テーマ.

7
t31os

登録されているかどうかにかかわらず、データベースに明確に存在する分類法を無視してWordpressのナンセンスを邪魔したくない場合は、いつでもこのような置換関数を使用して分類法を取得できます。

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