すべての商品にカテゴリを追加する方法を見つけるのに問題があります。
私は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内のカテゴリマネージャを使用して簡単になるようにすべてのカテゴリを書き込むことを考えていましたじゃない。
あなたはそれがこのように機能すると思いますか?それとも何をお勧めですか?ありがとうございます。
BulkPress を使ってみることができます。それはあなたが非常に簡単に何百ものカテゴリを作成することを可能にします。次の手順を実行します:
次のようにインポートしたいカテゴリ階層を書くことができたら便利ではないでしょうか。
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
そしてインデントによって定義された階層。
インデントにスペースを使用し、列区切り文字として|
を使用する例です。
$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 = '
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 );
以下のように用語をインポートします。
以下は、文字列から用語を一括インポートするためのこのような関数の最初のドラフトです。
/**
* 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
を通してそれを実行することができます。
あなたがこれをあなたのニーズにもっと拡張できることを願っています、例えば。フォーマットバリデーターと既存の用語で何をするべきか(現在我々はそれらをここで影響を受けないままにしておく)。
テストの前にバックアップしてください。