web-dev-qa-db-ja.com

Wordpressでカスタム分類法にカスタムフィールドを追加する方法

分類法に追加された余分なフィールドを節約する。そのための最も適切で効率的な方法が欲しいのです。新しいフィールドはどこに保存すればいいですか?

2つの可能な解決策は

1)ここに記述されているようにWordpressのオプションテーブルを使用してください... カスタム分類法へのカスタムフィールドの追加 。これは明らかに「きれいではない」ことであり、正しい答えではないと思われます。

// A callback function to save our extra taxonomy field(s)
function save_taxonomy_custom_fields( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
    $t_id = $term_id;
    $term_meta = get_option( "taxonomy_term_$t_id" );
    $cat_keys = array_keys( $_POST['term_meta'] );
        foreach ( $cat_keys as $key ){
        if ( isset( $_POST['term_meta'][$key] ) ){
            $term_meta[$key] = $_POST['term_meta'][$key];
        }
    }
    //save the option array
    update_option( "taxonomy_term_$t_id", $term_meta );
}
}

2)ここに記述されているように新しいテーブルを追加しなさい Wordpressのカスタム分類法 'wp_' + customtaxonomykey + 'meta'の命名規則に従う。

3)その他の選択肢

2
csi

オプション2は最もクリーンな方法です - 私も何度も使っています。残念ながら、WordPressにはデフォルトのterm_metadataテーブルはまだありません。この記事も同じアプローチをカバーしています、 http://shibashake.com/wordpress-theme/add-term-or-taxonomy-meta-data

そしてもちろん、そのためのプラグインもあります:) http://wordpress.org/extend/plugins/taxonomy-metadata/ /

3
James

1)デフォルトのwp_optionsテーブル

私は本当に人々がなぜ提案するのか理解していない

update_option( "taxonomy_term_$t_id", $term_meta );

単一のオプションを持つことができる場合、そのインデックスは用語IDと値としてのカスタムフィールドです。

$options = get_option( 'taxonomy_term_meta' );
$options[$t_id] = $term_meta;
update_option( 'taxonomy_term_meta', $options );

そして単にオプションを引っ張り、与えられたTerm IDに格納された値を取得するだけです。

$options = get_option( 'taxonomy_term_meta' );
echo $options[$tax->term_id];

2)カスタムwp_taxonomymetaテーブル

それがJamesによってリンクされたプラグイン 分類法メタデータ です。そして、このテーブルが作成されると、add_get_update_およびdelete_metadataの各関数が'taxonomy'で機能し始めるようになります。そのようです:

function add_term_meta($term_id, $meta_key, $meta_value, $unique = false) {
    return add_metadata('taxonomy', $term_id, $meta_key, $meta_value, $unique);
}

function delete_term_meta($term_id, $meta_key, $meta_value = '') {
    return delete_metadata('taxonomy', $term_id, $meta_key, $meta_value);
}

function get_term_meta($term_id, $key, $single = false) {
    return get_metadata('taxonomy', $term_id, $key, $single);
}

function update_term_meta($term_id, $meta_key, $meta_value, $prev_value = '') {
    return update_metadata('taxonomy', $term_id, $meta_key, $meta_value, $prev_value);
}

3)ヘルパーポストタイプ

Matthew Boynes answer(誰かがチケット#10142でもこれに言及していると思います)で説明されているように。

4)箱の外側

プラグインコード には、 Core Ticket#10142 へのリンクがあり、これすべてについて議論しています。 4年前のチケット(closed)(maybelater)で、たくさんの開発者が飛び込んできましたが、結論には至りませんでした。

それが終わるまでに、私たちはこのナゲットを持っています(私の強調)。

paco pepe 
これを定期的に必要としているので、私は私自身の解決策を書きました:"description"フィールドを直列化された配列の格納コンテナとして誤用しています。ちょっとトリッキーだった唯一のことは管理UIで明白な説明を表示することでした。とにかく、これが私が望んでいた解決策になるでしょう:たくさんの新しいフィールドを追加する代わりに単にdescriptionフィールドを変換してください。それが必要な場合は、入手した後にユースケースを確認し、それ以降のバージョンで検索可能なソリューションを探します。

きれい賢い

2
brasofilo

最良の答えは(3)その他のオプションです。

これは少し型破りですが、最適にスケーリングされ、コアを最大限に活用し、データベーステーブルを追加する必要はありません:タクソノミーに非表示の投稿タイプを追加します。分類法の各用語は、投稿タイプで独自の投稿を取得します。これを適切に使用すると、メタという用語をポストメタとして保存できます。 このアプローチの使用例

その他のアプローチ(「用語の説明フィールドを使用してシリアル化されたデータを保持する」オプションを含む)の主な問題は、スケーラビリティ、パフォーマンス、および互換性です。

2
Matthew Boynes

添付ファイルIDをオプションテーブルに保存して、その添付ファイルを表示することができます

分類法のためのメタボックスを追加するための3つの主な機能があります。これらは以下のフックを通して呼び出されます。

  1. {taxonomy_name} _ add_form_fields
  2. {taxonomy_name} _ edit_form_fields
  3. 編集した_ {分類名}}
  4. _ {taxonomy_name}を作成します

ここでは、taxonomy_nameを任意の定義済みまたはカスタムの分類法に合わせて変更できます。「Woocommerce product taxonomy」を使用して同じプラグインを作成しました。

{taxonomy_name} _add_form_fields新しいカスタムページを追加して新しい用語ページフォームを追加します。ここでは、用語のクラスを追加するためのフィールドを作成しています。

テーマのfunctions.phpに次のコードを追加してください。

public function mj_taxonomy_add_custom_meta_field() {
            ?>
            <div class="form-field">
                <label for="term_meta[class_term_meta]"><?php _e( 'Add Class', 'MJ' ); ?></label>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="">
                <p class="description"><?php _e( 'Enter a value for this field','MJ' ); ?></p>
            </div>
        <?php
        }
    add_action( 'product_cat_add_form_fields', 'mj_taxonomy_add_custom_field', 10, 2 );

{taxonomy_name} _edit_form_fieldsは用語編集ページにフィールドを追加します

public function mj_taxonomy_edit_custom_meta_field($term) {

        $t_id = $term->term_id;
        $term_meta = get_option( "taxonomy_$t_id" ); 
       ?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="term_meta[class_term_meta]"><?php _e( 'Add Class', 'MJ' ); ?></label></th>
            <td>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="<?php echo esc_attr( $term_meta['class_term_meta'] ) ? esc_attr( $term_meta['class_term_meta'] ) : ''; ?>">
                <p class="description"><?php _e( 'Enter a value for this field','MJ' ); ?></p>
            </td>
        </tr>
    <?php
    }

add_action( 'product_cat_edit_form_fields','mj_taxonomy_edit_custom_meta_field', 10, 2 );

public function mj_save_taxonomy_custom_meta_field( $term_id ) {
        if ( isset( $_POST['term_meta'] ) ) {

            $t_id = $term_id;
            $term_meta = get_option( "taxonomy_$t_id" );
            $cat_keys = array_keys( $_POST['term_meta'] );
            foreach ( $cat_keys as $key ) {
                if ( isset ( $_POST['term_meta'][$key] ) ) {
                    $term_meta[$key] = $_POST['term_meta'][$key];
                }
            }
            // Save the option array.
            update_option( "taxonomy_$t_id", $term_meta );
        }

    }  
add_action( 'edited_product_cat', 'mj_save_taxonomy_custom_meta_field', 10, 2 );  
add_action( 'create_product_cat', 'mj_save_taxonomy_custom_meta_field', 10, 2 );
1
shishir mishra

https://wordpress.org/plugins/taxonomy-metadata/ /

あなたは上記のプラグインを介してカスタマイズすることができます..

0
shishir