web-dev-qa-db-ja.com

指定された場合、get_termsはproduct_catまたは他のカスタム分類法を表示しません

この問題についていくつか考えがあるかどうか疑問に思います。私は何日もグーグルだが、それを理解することはできない。

ここが私がいるところです:

Woocommerceの投稿タイプ「商品」のメタボックスがあります。メタボックスの中には、利用可能なすべての'type' = > 'select'のリストを追加したい'taxonomy' = > 'product_cat'があります。

次のコードを使用して、選択ボックスに標準の投稿カテゴリ'taxonomy' = > 'category'を入力して操作することができます。

function product_cats() {
$options = array();

$categories = get_terms( array( 'taxonomy' => 'category' ) );
foreach( $categories as $category ) {
    $options[$category->term_id] = array(
        'label' => $category->name,
        'value' => $category->slug
    );
}
// return array('options'=>$options);
return $options;
}

‘taxonomy' = > ‘product_cat’や他のカスタム分類法を使用しようとすると、すべてがバラバラになります。

問題は、登録する前にカスタム分類法にアクセスしようとしているため、function.phpファイル(CPT、メタボックス、およびwoocommeceを呼び出すもの)内のいくつかの宣言/呼び出しを変更して潜在的に変更したこと物事がうまくいったが運が悪い順序。

しかし、以下の質問と回答に基づいて、分類法を超えて、関数がすべての用語を「表示」して表示できることを確認できます。引数から'taxonomy =>を除外すると、カスタム投稿タイプと分類法全体の用語が返されます。

基本的な機能は理想的には次のようになります。

function product_cats() {
$options = array();

$categories = get_terms( array( 'taxonomy' => 'product_cat' ) );
foreach( $categories as $category ) {
    $options[$category->term_id] = array(
        'label' => $category->name,
        'value' => $category->slug
    );
}
// return array('options'=>$options);
return $options;
}

一般的な考えがあるかどうか疑問に思いますか?コードベース全体を見ないと難しいことはわかっていますが、質問する価値があると思いました。

Wordpressのバージョン4.7.2

Woocommerceバージョン2.6.14

更新:

私はゆっくりと自分の問題を特定しようとしています。

'product_cat'は結局のところアクセスできるように見えます(良い)が、正しく表示されない配列を吐き出しています。

これは私がパラメータなしで単にget_terms()を使っているか、'taxonomy' => 'category'を指定しているかのように私を混乱させています。

これを扱うために必要な他のコードは次のとおりです。

ダンプするオプションのリストが欲しい配列

    array(  
        'label'=> 'Collections',
        'desc'  => 'Select the collection you would like to display',
        'id'    => $prefix.'collection',
        'type'    => 'select',  
        'options' => product_cats()
),

選択リストを生成するコード(他のメタフィールドに使用される)

// select
case 'select':
echo '<select name="'.$field['id'].'" id="'.$field['id'].'">';
foreach ($field['options'] as $option) {
    echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>';
}
echo '</select><br /><span class="description">'.$field['desc'].'</span>';
break;

選択リストを含め、他のメタフィールドが機能していたり​​表示されていても問題はありません。

私はむしろ、メタボックス全体をそのすべてのフィールドで書き直すことはしたくないので、現在持っているものを使って作業しようとしています。

2

私の人生のために、私は本当にこれを 正しい方法で動かしたいです 。私の人生のために私は統合を把握することはできません。

以前は wp_dropdown_categories() を見て、それがより良い(そしてより簡単な)解決策であると思っていました。既存のメタボックスの構文を使用する方法を理解することができなかったので、私は上記の問題に取り組んで着陸しました。

今のところ、私は以下の一時的な修正を決定しました。これは理想的ではないし、確かに最善の方法でもありませんが、このフィールドを利用するテンプレート内の値を呼び出すことで先に進むことができます。

// Wrap all categories in a function
function product_cats() {
    $output = array();
    $categories = get_terms( array(
    'orderby'      => 'name',
    'pad_counts'   => false,
    'hierarchical' => 1,
    'hide_empty'   => true,
    ) );
    foreach( $categories as $category ) {
        if ($category->taxonomy == 'product_cat' ) {
            $output[$category->slug] = array(
                'label' => $category->name,
                'value' => $category->slug
            );
        }
    }
    //return array('options'=>$output);
    return $output;
}

私が進むにつれて私はもっと更新します。

1

これはおそらく修正するつもりはないが、共有したいと思いました。もしこれがあなたの場合であれば、'hide_empty' => falseを追加することを忘れないでください。

それは言った。引数なしでget_terms()を実行したとき。出力は何ですか?

0
Marinus Klasen

あなたはたぶん古いバージョンのWordPress(4.5以前)を実行しています。

WordPress 4.5.0より前では、get_terms()の最初のパラメータは分類法または分類法のリストでした。4.5.0以降、分類法は$ args配列の 'taxonomy'引数を介して渡されるべきですそのように動作します)。

これらの変更に関するすべての詳細は get_terms()リファレンスページ にあります。

更新: 申し訳ありませんが、自分のコードを確認しました。get_termsではなくget_categories()を使用しています。正しいget_terms()は機能しません。

これは私のすべてのproduct_catをリストするための実用的な例です。

$product_categories = get_categories( array(
    'taxonomy'     => 'product_cat',
    'orderby'      => 'name',
    'pad_counts'   => false,
    'hierarchical' => 1,
    'hide_empty'   => false
) );

それが役に立てば幸い !

0
Benoti

これは、商品カテゴリ選択ボックスを表示するメタボックスの完全に機能する例です。メタボックスが商品の投稿タイプに表示されます。

add_action( 'add_meta_boxes', 'wpse256897_add_meta_box' );
add_action( 'save_post',     'wpse256897_save' );
/**
 * Adds the meta box container.
 */
function wpse256897_add_meta_box( $post_type ) {
    // Limit meta box to certain post types.
    $post_types = array( 'product' );

    if ( in_array( $post_type, $post_types ) ) {
        add_meta_box(
            'product_cat_selection',
             __( 'Product Category Selection', 'textdomain' ),
             'wpse256897_render_meta_box_content',
             $post_type,
             'advanced',
             'high'
        );
    }
}

/**
 * Save the meta when the post is saved.
 *
 * @param int $post_id The ID of the post being saved.
 */
function wpse256897_save( $post_id ) {
    /*
     * We need to verify this came from the our screen and with proper authorization,
     * because save_post can be triggered at other times.
     */

    // Check if our nonce is set.
    if ( ! isset( $_POST['myplugin_inner_custom_box_nonce'] ) ) {
            return $post_id;
    }

    $nonce = $_POST['myplugin_inner_custom_box_nonce'];

    // Verify that the nonce is valid.
    if ( ! wp_verify_nonce( $nonce, 'myplugin_inner_custom_box' ) ) {
            return $post_id;
    }

    /*
     * If this is an autosave, our form has not been submitted,
     * so we don't want to do anything.
     */
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
            return $post_id;
    }

    // Check the user's permissions.
    if ( 'page' == $_POST['post_type'] ) {
            if ( ! current_user_can( 'edit_page', $post_id ) ) {
                    return $post_id;
            }
    } else {
            if ( ! current_user_can( 'edit_post', $post_id ) ) {
                    return $post_id;
            }
    }

    /* OK, it's safe for us to save the data now. */

    // Sanitize the user input.
    $mydata = sanitize_text_field( $_POST['product_cat_selection'] );

    // Update the meta field.
    update_post_meta( $post_id, '_product_cat_selection', $mydata );
}

/**
 * Render Meta Box content.
 *
 * @param WP_Post $post The post object.
 */
function wpse256897_render_meta_box_content( $post ) {
    // Add an nonce field so we can check for it later.
    wp_nonce_field( 'myplugin_inner_custom_box', 'myplugin_inner_custom_box_nonce' );

    // Use get_post_meta to retrieve an existing value from the database.
    $current_product_cat = get_post_meta( $post->ID, '_product_cat_selection', true );

    // Display the form, using the current value.
    $product_cats = wpse256897_product_cats();
    if ( !empty ( $product_cats ) ) {
        echo '<select name="product_cat_selection" id="product_cat_selection">';
        foreach ( $product_cats as $product_cat_id => $product_cat ) { ?>
            <option value="<?php echo esc_attr( $product_cat['value'] ); ?>" <?php if ( isset ( $current_product_cat ) ) selected( $current_product_cat, $product_cat['value'] ); ?>><?php echo esc_html( $product_cat['label'] ); ?></option><?php
        }
        echo '</select>';
    }
}               

function wpse256897_product_cats() {
    $options = array();
    $categories = get_terms( array( 'taxonomy' => 'product_cat' ) );

    foreach( $categories as $category ) {
        $options[$category->term_id] = array(
                'label' => $category->name,
                'value' => $category->slug
        );
    }

    return $options;
}

これは最も洗練された例ではありません(命名規則のほうが良いかもしれません)。これは メタボックス参照ページの追加 の投稿されたメモからすばやく修正されましたが、wpse256897_product_cats()が商品カテゴリを取得し、それらが保存され、商品ページの選択ボックスに表示されることを示しますメタボックス.

また、 wp_dropdown_categories() 関数をチェックする価値があるかもしれないことを付け加えたいと思います。その名前にもかかわらず、これはカスタム分類法でも機能します。これはあなた自身のカテゴリードロップダウンマークアップを作成することからあなたを救うでしょう。

更新: product_cats()関数によって返される配列の構造は、あなたのメタボックスの実装とは異なります。上の例では、select要素のオプションを生成するときに、この行を使用してカテゴリをループ処理しています。

foreach ( $product_cats as $product_cat_id => $product_cat ) { ?>

これは$product_catsが各カテゴリIDのlabelslugを含む別の配列を保持するカテゴリIDの連想配列だからです。

あなたのメタボックスコードと互換性のある方法で戻り値$ optionsをフォーマットするproduct_cats()のこの代替バージョンをおそらく使うことができるように見えます:

function product_cats_alternate() {
    $options = array();

    $categories = get_terms( array( 'taxonomy' => 'product_cat' ) );
    foreach( $categories as $category ) {
            $options[] = array(
              'label' => $category->name,
              'value' => $category->slug
            );
    }
    return $options;
}
0
Dave Romsey