J'ai du mal à trouver un moyen d'ajouter des catégories pour tous les produits.
J'ai des catégories Apple, Samsung, Sony, Xiaomi, Huawei et chacune d’elles a besoin de sous-catégories qui représentent des modèles, ainsi que des parties spécifiques.
exemple d'arborescence de catégories:
Apple> Iphone 6s> Batterie pour Iphone 6s
Apple> Iphone 6s> Écran de remplacement Iphone 6s>
Apple> Iphone 8> Batterie pour Iphone 8
etc
Tous les produits doivent appartenir à une catégorie distincte pour que je puisse afficher le bon élément sous le bon élément de menu et aucun autre élément d’Iphone, uniquement la batterie, par exemple.
Comment créer plus de 500 catégories qui représenteront tous les éléments que nous avons?
Je pensais exporter la base de données existante et éditer dans un éditeur de texte et y écrire toutes les catégories, ce qui serait plus simple que d’utiliser le gestionnaire de catégories dans WordPress cpanel, ce qui est très mauvais pour cela, 't.
Pensez-vous que cela fonctionnera de cette façon? Ou que suggérez-vous? Merci!
Vous pouvez essayer d’utiliser BulkPress . Il vous permet de créer très facilement des centaines de catégories. Suivez ces étapes:
Ne serait-il pas pratique si nous pouvions écrire notre hiérarchie de catégories que nous souhaitons importer en tant que:
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
avec chaque ligne comme:
term slug|term name|term description
et la hiérarchie définie par l'indentation.
Exemple utilisant un espace pour l'indentation et |
en tant que délimiteur de colonne:
$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 );
cela importerait les termes comme:
Un autre exemple utilisant une tabulation pour l'indentation et une virgule comme délimiteur de colonne:
$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 );
termes d'importation en tant que:
Voici un premier brouillon pour une telle fonction permettant d'importer en bloc les termes d'une chaîne:
/**
* 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'];
}
}
}
Lorsque nous insérons un terme, nous devons connaître son parent. Nous devons donc collecter le terme direct ancêtres lorsque nous traversons la hiérarchie. Le pile est une structure de données appropriée, où dernier élément entré est le premier élément sorti (LIFO). Dans PHP 5.3+, nous pouvons utiliser SplStack
qui implémente déjà des méthodes telles que pop()
, Push()
, top()
et count()
.
En comparant le niveau actuel au nombre d'ancêtres actuels, nous pouvons déterminer si nous allons vers l'intérieur (à droite) ou vers l'extérieur (à gauche) et ajuster la pile en conséquence. Réduire la pile quand on va à gauche et Pousser jusqu'à la pile quand on va à droite.
Pour une importation importante, vous pouvez l'exécuter via le wp-cli
pour éviter le délai d'expiration.
J'espère que vous pourrez l'étendre davantage à vos besoins, par exemple. avec un validateur de format et que faire des termes existants (nous les laissons actuellement non affectés ici).
S'il vous plaît sauvegarder avant de tester!