web-dev-qa-db-ja.com

Wpに450のカテゴリを作成する方法

すべての商品にカテゴリを追加する方法を見つけるのに問題があります。

私はApple、Samsung、Sony、Xiaomi、Huaweiのカテゴリーを持っていて、そこにはそれぞれモデルを表すサブカテゴリー、そして特定の部分が必要です。

カテゴリツリーの例:
アップル> iPhone 6 s> iPhone 6 s電池
アップル> iPhone 6 s> iPhone 6 s交換画面>
アップル> iPhone 8> iPhone 8バッテリー

私は正しいメニュー項目の下に正しい項目を表示することができますし、他のIphoneのものはなく、例えばバッテリーだけなので、すべての製品は別々のカテゴリにある必要があります。

私たちが持っているすべてのアイテムを表す500以上のカテゴリをどのように作成しますか?

既存のデータベースをエクスポートしてテキストエディタで編集し、そこにあるものとisnがわからなくなってしまうので、これは非常に悪いWordPress cpanel内のカテゴリマネージャを使用して簡単になるようにすべてのカテゴリを書き込むことを考えていましたじゃない。

あなたはそれがこのように機能すると思いますか?それとも何をお勧めですか?ありがとうございます。

2
Martin Valihora

BulkPress を使ってみることができます。それはあなたが非常に簡単に何百ものカテゴリを作成することを可能にします。次の手順を実行します:

  1. プラグインをインストールしてアクティブにします。
  2. 左側のサイドバーで、 Bulkpress にカーソルを合わせます。次に 用語 をクリックします。
  3. 新しいページが表示されます。 分類法 フィールドで、 カテゴリ を選択します。
  4. Terms フィールドに Categories を入力します。
  5. 必要に応じて、希望するを選択してください。
  6. 最後に、 用語の追加 ボタンをクリックしてください。

次のようにインポートしたいカテゴリ階層を書くことができたら便利ではないでしょうか。

Apple|Apple|Apple products
 iphone-6s|Iphone 6s|Apple Iphone 6s
  iphone-6s-battery|Iphone 6s battery|Apple Iphone 6s battery
  iphone-8-battery|Iphone 8 battery|Apple Iphone 8 battery

各行を次のようにします。

term slug|term name|term description

そしてインデントによって定義された階層。

例1

インデントにスペースを使用し、列区切り文字として|を使用する例です。

$import = '
a1|A1|Term description
 a11|A11|Term description
  a111|A111|Term description
  a112|A112|Term description
 a12|A12|Term description
';

wpse324129_bulk_terms_importer( $import, 'category', '|', PHP_EOL );

これは、用語を次のようにインポートします。

Import example #1 

例2

タブをインデントに使用し、カンマを列の区切り文字として使用する別の例:

$import = '
a1,A1,"Term description, including column delimiter"
    a11,A11, "Term description, including column delimiter"
        a111,A111,"Term description, including column delimiter"
        a112,A112,"Term description, including column delimiter"
    a12,A12,"Term description, including column delimiter"
';

wpse324129_bulk_terms_importer( $import, 'category', ',', PHP_EOL );

以下のように用語をインポートします。

Import examle #2 

実装

以下は、文字列から用語を一括インポートするためのこのような関数の最初のドラフトです。

 /**
  * Bulk Term Importer
  *
  * Bulk import terms with a given hierarchy, defined by indentation (tab or space).
  *
  * @version 0.1.3
  *
  * @see https://wordpress.stackexchange.com/a/324157/26350
  *
  * @param string $import        Terms to import
  * @param string $tax           Taxonomy. Default 'category'.
  * @param string $col_delimiter Column delimiter. Default '|'.
  * @param string $row_delimiter Row delimiter. Default PHP_EOL.
  */
function wpse324129_bulk_term_importer( $import, $tax = 'category', $col_delimiter = '|', $row_delimiter = PHP_EOL ) {
    $rows         = explode( $row_delimiter, trim( $import ) );
    $level        = 0;
    $prev_term_id = 0;
    $ancestors    = new \SplStack(); // Last-In First-Out.

    foreach( $rows as $row ) {
        $cols = str_getcsv( $row, $col_delimiter );
        if ( 3 !== count( $cols ) ) {
            throw new Exception( __( 'Incorrect number of columns', 'wpse' ) );
        }
        $term_slug = $cols[0];
        $term_name = $cols[1];
        $term_desc = $cols[2];

        // Hierarchy traversal level (non negative).
        $level = strlen( $term_slug ) - strlen( ltrim( $term_slug ) );

        // Push the previous term to the ancestors stack if we go inner (right).
        if ( $level > $ancestors->count() ) {
            $ancestors->Push( $prev_term_id );
        } // After: level === ancestors count

        // Reduce the ancestors' stack when we go outer (left).
        while ( $level < $ancestors->count() ) {
            $ancestors->pop();
        } // After: level === ancestors count

        // Arguments for term creation.
        $args = [
            'description' => $term_desc,
            'slug'        => $term_slug,
        ];

        // Check parent term and add to the term creation arguments if needed.
        if ( $prev_term_id > 0 && $ancestors->count() > 0 ) {
            $parent_id   = $ancestors->top(); // The parent is the one on the top.
            $parent_term = get_term_by( 'term_id', $parent_id, $tax, ARRAY_A );
            if ( isset( $parent_term['term_id'] ) ) {
                $args['parent'] = $parent_term['term_id'];
            }
        }

        // Check if current term slug exists and insert if needed.
        $term = get_term_by( 'slug', $term_slug, $tax, ARRAY_A );   
        if ( ! isset( $term['term_id'] ) ) {    
            $result = wp_insert_term( $term_name, $tax, $args );
            if ( is_wp_error( $result ) ) {
                throw new Exception( __( 'Could not insert term!', 'wpse' ) );
            }
            $prev_term_id = $result['term_id'];
        } else {
            $prev_term_id = $term['term_id'];
        }
    }
}

用語を挿入するときは、その親について知っておく必要があります。そのため、階層をトラバースするときに直接項の先祖を集める必要があります。 stack は適切なデータ構造です。ここで、最後の項目最初の項目(LIFO)です。 PHP 5.3以降では、 SplStack を使用できます。これはすでにpop()Push()top()count()のようなメソッドを実装しています。

現在のlevelを現在の先祖の数と比較することで、内側(右)か外側(左)かを判断し、それに応じてスタックを調整できます。左に行くとスタックを減らし、右に行くとスタックにプッシュします。

大規模なインポートでは、タイムアウトを回避するためにwp-cliを通してそれを実行することができます。

あなたがこれをあなたのニーズにもっと拡張できることを願っています、例えば。フォーマットバリデーターと既存の用語で何をするべきか(現在我々はそれらをここで影響を受けないままにしておく)。

テストの前にバックアップしてください。

3
birgire