Aktualisieren Sie benutzerdefinierte Attribute WooCommerce

Zunächst einmal, danke, dass Sie Teil einer beeindruckenden Gemeinschaft sind, die mir schon tausend Mal geholfen hat.

In meiner WordPress Umgebung (Enfold Theme, Woocommerce Plugin) habe ich ein System erstellt um eine Umfrage als Eingabe für sofort zu erstellende Beiträge in einer Front-End Webseite zu verwenden. Antworten auf die Umfrage sind in automatisch generierten Posts enthalten (Typ ‘Produkt’) einschließlich WooCommerce Custom Attribute.

Ich schrieb benutzerdefinierte Abfragen, die auf Trigger in mySQL reactjsen – Einfügen und Aktualisieren von wp_posts, wp_terms, wp_postmeta, wp_term_relationships.

Alles funktioniert gut, mit einer Ausnahme: WooCommerce benutzerdefinierte Produktattribute werden nicht sofort in Dropdown / Auswahl-Filter auf der Website angezeigt. Das manuelle Drücken von Update auf der WordPress-Seite erledigt den Job.

Ich bin auf der Suche nach einer Möglichkeit, die ‘manuelle’ Aktualisierung im WordPress CMS zu replizieren. Bis jetzt wird der Beitrag selbst erfolgreich in die Website geladen, aber seine WooCommerce-Produktattribute werden nicht instanziiert.

Bisher habe ich viele Problemumgehungen ausprobiert:

  • Programmgesteuertes Festlegen des Status eines Posts (Entwurf) und sofortiges Ändern in einen veröffentlichten Post (Veröffentlichen);
  • Verwenden des integrierten Post-Schedulings von WordPress durch Festlegen einer Zeit, zu der es veröffentlicht werden soll;
  • Aufruf von wp_update_post;
  • Verwenden des Tao Scheduled Updates Plugins ( https://nl.wordpress.org/plugins/tao-schedule-update/ );
  • Verwenden des WordPress PostController Plugins ( https://github.com/HarriBellThomas/Wordpress_PostController )

Alle Versuche aktualisieren nur die Posts in wp_posts, anscheinend nicht die zugrunde liegenden Relationen / benutzerdefinierten Produktattribute.

Meine einzige Anforderung wäre, das Klicken auf “Update” in der WordPress CMS-Umgebung programmatisch zu replizieren. Dies würde mir helfen, den process zu automatisieren, anstatt mich manuell einzumischen.

Könnten Sie mir bitte einen Weg vorschlagen, wie Sie das tun können?

Vielen Dank für Ihre Zeit!

AKTUALISIEREN:

Hallo Tom,

Nachdem ich in deine Antwort eingetaucht bin, verstehe ich es immer noch nicht.

Meine Abfragen aktualisieren / fügen alle erforderlichen Tabellen ein. Sie folgen praktisch alle Schritte aus Ihren PHP-Skripten.

Wenn ich ein Produkt im CMS überprüfe, sehe ich alle Daten – und insbesondere die Attribute – korrekt geladen. Wenn ich Update manuell im CMS drücke und die Daten in den mySQL-Tabellen vor und nach der Aktualisierung vergleiche, sehe ich keine wesentlichen Unterschiede. Das einzige, was ich sehe, ist der Wert für _product_attributes in wp_postmeta, der etwas anders ist (serialisierte Zeichenfolge).

Wenn ich jedoch mit diesem Wert experimentiere (lease / ändere ihn für den spezifischen Post in wp_postmeta), ändert sich nichts an den Attributen – und alles funktioniert immer noch beim Filtern.

Was mich zu den Fragen bringt:

  • Was genau passiert, wenn man “Update” manuell drückt?
  • Gibt es einen anderen Speicher außer den mySQL-Tabellen, in denen Teile irgendwie verbunden sind?
  • Wäre es möglich für mich, 1) die Prozedur “Produkt erstellen” zu erstellen, die Sie als selbstverständlich bezeichnen und überspringen (wie ich meine eigenen Abfragen ausgeführt habe) und dann 2) nur die genaue Prozedur aufrufen, die beim Drücken von Update ausgeführt wird – um es zu lassen Alles zusammenbinden, ohne alle databaseeinträge neu zu erstellen?
  • Wenn ja, wo finde ich dieses spezifische Verfahren?

Deine Hilfe ist sehr Willkommen. Vielen Dank! Thom

Solutions Collecting From Web of "Aktualisieren Sie benutzerdefinierte Attribute WooCommerce"

OK, also hatte ich selbst eine Variante dieses Problems und ich werde Sie durchgehen.

Alles funktioniert gut, mit einer Ausnahme: WooCommerce benutzerdefinierte Produktattribute werden nicht sofort in Dropdown / Auswahl-Filter auf der Website angezeigt. Das manuelle Drücken von Update auf der WordPress-Seite erledigt den Job.

Beim Anzeigen von Attributen funktioniert wocommerce wie folgt: wc_get_attribute_taxonomies () ( http://woocommerce.wp-a2z.org/oik_api/wc_get_attribute_taxonomies/ )

Sie werden in dieser function bemerken, dass es die Daten von einem “transient” bekommt (denken Sie zwischengespeicherte Daten, sehen Sie http://codex.wordpress.org/Transients_API ).

Wenn Sie Daten manuell in die database hochladen, besteht die Möglichkeit, dass Sie den Transient hochgeladen haben (der wp_options in wp_options geht). Wenn Sie im WordPress Admin Panel auf update klicken, starten Sie die function, die den Transient aktualisiert, weshalb sie / show dann und nicht vorher funktionieren.

Um dies zu erreichen, müssen Sie sicherstellen, dass Ihre manuelle Aktualisierung von MySQL auch die Transienten aktualisiert. Für mich, die Produktattribute in woocommerce manuell hinzufügend, musste ich eine Reihe in wp_options mit options_name _transient_wc_attribute_taxonomies und meinen Attributen im serialisierten Feld in der Spalte option_value (plus eine Identifikation Autoload gesetzt zu ja). Aber es gibt andere Transienten, also hängt es davon ab, welche function das Problem verursacht und was Sie anzeigen möchten. Sie können sehen, welche Sie fehlen, indem wp_options einmal eine MySQL-Suche nach %transient% in wp_options , bevor Sie im wordpress Admin-Panel auf update klicken und danach die Daten vergleichen.

Aktualisieren Sie auch die Begriffe im WooCommerce-Produkt? Wp_term_taxonomy und wp_woocommerce_attribute_taxonomies beide mit Ihren Taxonomiebegriffen aktualisiert werden, damit das Woocommerce-Produkt die Drop-down-Optionen “Farbe” oder “Größe” anzeigen kann.

Wenn ein Wococommerce-Produkt programmgesteuert erstellt wird, müssen Produktvariationen eingefügt und in vorhandene Attribute eingebunden werden (Taxonomien, die in Woocommerce erstellt werden).

Sehen Sie sich den Post-Metaschlüssel “_product_attributes” an, der die Attributdaten enthält. Sie müssen immer noch die Begriffe (Attribute) mit Ihrem Produkt verbinden (innerhalb von wp_term_taxonomy ), aber hoffentlich gibt Ihnen das eine Richtung, in die Sie einziehen können.

Sehen Sie sich auch die functionen create_product ( https://github.com/woothemes/woocommerce/blob/master/includes/api/class-wc-api-products.php#L237 ) und save_variations ( https: // github. com / woothemes / woocommerce / blob / master / enthält / api / class-wc-api-products.php # L1692 ), die beide beschreiben, wie Sie die Erstellung des Produkts und seiner Variationen durchführen.

Dies ist eine Option mit PHP-Code:

 function change_price_by_type ($ product_id, $ price, $ price_type) {
    update_post_meta ($ product_id, '_'. $ price_type, $ price);
 }

 function change_price_all_types ($ product_id, $ price) {
     change_price_by_type ($ product_id, $ price, 'price');
     change_price_by_type ($ product_id, $ price, 'sale_price');
     change_price_by_type ($ product_id, $ price, 'regulary_price');
 }


 function change_product_price ($ product_id, $ price) {
     change_price_all_types ($ product_id, $ price); 
     $ product = wc_get_product ($ product_id);  // Umgang mit variablen Produkten

     if ($ produkt-> is_type ('variable')) {
         // RM: Erhalten Sie Variationen, die ebenfalls nicht auf Lager sind
         $ args = Array (
         'post_type' => 'Produktvariation',
         'post_status' => array ('privat', 'veröffentlichen'),
         'Nummernpfeil' => -1,
         'orderby' => 'menu_order',
         'bestellen' => 'asc',
         'post_parent' => $ product_id // $ post-> ID 
         );
         $ variations = get_posts ($ args); 
         foreach ($ Variationen als $ Variation) {
                 change_price_all_types ($ variation-> ID, $ price);
         }
     }
 }

 $ args = array ('post_type' => 'product', 'posts_per_page' => 3000);
 $ products = get_posts ($ args); 

 foreach ($ Produkte als $ Produkt) {
     change_product_price ($ product-> ID, 9.99);
     echo $ produkt-> ID;
 }

 Ausfahrt;

Gehen Sie dann zu phpMyAdmin und führen Sie folgende SQL-Abfragen aus (Sie müssen möglicherweise Ihren Tabellennamen anstelle von wp_ ändern).

 UPDATE `wp_postmeta`
 SET `meta_wert` = ''
 WHERE `meta_key` IN ('_sale_price', '_sale_price_dates_from', '_sale_price_dates_to')
   UND `post_id` IN
     (Wählen Sie ID aus
      Von `wp_posts`
      WO `post_type` = 'Produkt'
        UND `post_status` = 'veröffentlichen');

Cache leeren:

 LÖSCHEN
 Von `wp_options`
 WHERE (`option_name` LIKE '_transient_wc_var_prices_%'
     ODER `option_name` LIKE '_transient_timeout_wc_var_prices_%')

SQL-Code wurde entnommen aus: http://www.technoedu.com/forums/topic/wordpress-solved-copy-woocommerce-products-sale-prices-to-regular-prices-and-reset-sale-prices/