webentwicklung-frage-antwort-db.com.de

So erstellen Sie 450 Kategorien in wp

Ich habe Probleme, eine Möglichkeit zum Hinzufügen von Kategorien für alle Produkte zu finden.

Ich habe Apple-, Samsung-, Sony-, Xiaomi-, Huawei-Kategorien und jede von ihnen benötigt Unterkategorien, die für Modelle und auch für bestimmte Teile stehen.

beispiel für einen Kategoriebaum:
Apple> Iphone 6s> Iphone 6s Akku
Apple> Iphone 6s> Iphone 6s-Ersatzbildschirm>
Apple> Iphone 8> Iphone 8-Akku
usw

Alle Produkte müssen in einer getrennten Kategorie sein, damit ich unter dem richtigen Menüpunkt das richtige Element und kein anderes iPhone-Zeug anzeigen kann, nur die Batterie zum Beispiel.

Wie erstelle ich mehr als 500 Kategorien, die alle Artikel darstellen, die wir haben?

Ich überlegte, vorhandene Datenbanken zu exportieren und im Texteditor zu bearbeiten und alle Kategorien dort zu schreiben, da dies einfacher wäre als die Verwendung des Kategoriemanagers in WordPress cpanel nicht.

Glaubst du, es wird so funktionieren? Oder was schlagen Sie vor? Vielen Dank!

2
Martin Valihora

Sie können versuchen, BulkPress zu verwenden. Damit können Sie ganz einfach Hunderte von Kategorien erstellen. Folge diesen Schritten:

  1. Installieren und aktivieren Sie das Plugin.
  2. Bewegen Sie den Cursor in der linken Leiste auf Bulkpress . Klicken Sie dann auf Terms .
  3. Eine neue Seite wird angezeigt. Wählen Sie im Feld Taxonomie Kategorie .
  4. Geben Sie Ihre Kategorien in das Feld Begriffe ein.
  5. Wählen Sie bei Bedarf Ihr gewünschtes Elternteil .
  6. Klicken Sie abschließend auf die Schaltfläche Begriffe hinzufügen .

Wäre es nicht praktisch, wenn wir unsere Kategoriehierarchie schreiben könnten, die wir importieren möchten als:

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

mit jeder Zeile als:

term slug|term name|term description

und die durch den Einzug definierte Hierarchie.

Beispiel 1

Ein Beispiel mit einem Leerzeichen für Einrückung und | als Spaltentrennzeichen:

$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 );

das würde die Begriffe wie folgt importieren:

 Import example #1 

Beispiel # 2

Ein weiteres Beispiel mit einem Tabulator für Einrückung und Komma als Spaltentrennzeichen:

$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 );

begriffe importieren als:

 Import examle #2 

Implementierung

Hier ist ein erster Entwurf für eine solche Funktion zum Massenimport von Begriffen aus einer Zeichenfolge:

 /**
  * 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'];
        }
    }
}

Wenn wir einen Begriff einfügen, müssen wir dessen Eltern kennen. Wir müssen also die direkten Term-Vorfahren sammeln, wenn wir die Hierarchie durchqueren. Das stack ist eine geeignete Datenstruktur, wobei das letzte Element in das erste Element aus (LIFO) ist. In PHP 5.3+ können wir SplStack verwenden, das bereits Methoden wie pop(), Push(), top() und count() implementiert.

Durch Vergleichen des aktuellen Level mit der Anzahl der aktuellen Vorfahren können wir feststellen, ob wir nach innen (rechts) oder nach außen (links) gehen, und den Stapel entsprechend anpassen. Reduzieren Sie den Stapel, wenn wir nach links gehen, und drücken Sie auf den Stapel, wenn wir nach rechts gehen.

Für einen großen Import könnte man ihn über den wp-cli ausführen, um eine Zeitüberschreitung zu vermeiden.

Hoffe, Sie können dies weiter auf Ihre Bedürfnisse ausweiten, z. mit einem Formatvalidator und was mit bestehenden Begriffen zu tun ist (wir lassen sie hier derzeit unberührt).

Bitte sichern Sie vor dem Testen!

3
birgire