web-dev-qa-db-fra.com

Comment créer 450 catégories dans wp

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!

2
Martin Valihora

Vous pouvez essayer d’utiliser BulkPress . Il vous permet de créer très facilement des centaines de catégories. Suivez ces étapes:

  1. Installez et activez le plugin.
  2. Sur la barre de gauche, passez votre curseur sur Bulkpress . Puis cliquez sur Terms .
  3. Une nouvelle page apparaîtra. Dans le champ Taxonomie , choisissez Catégorie .
  4. Insérez votre Catégories dans le champ Conditions .
  5. Choisissez votre parent Parent , si nécessaire.
  6. Enfin, cliquez sur le bouton Ajouter des termes .
0

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 1

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:

 Import example #1 

Exemple n ° 2

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:

 Import examle #2 

La mise en oeuvre

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!

3
birgire