WooCommerce / HPOS
HPOS a WooCommerce: problemes habituals amb codi personalitzat
Resposta curta
Amb HPOS com a emmagatzematge principal, les comandes viuen a wp_wc_orders i les seves taules relacionades, no a wp_posts i wp_postmeta. El codi que llegeix o escriu comandes amb funcions d’entrades, WP_Query o SQL sobre les taules d’entrades deixa de funcionar, sovint en silenci i retornant valors buits. Reescriu-lo amb l’API de comandes (wc_get_order(), wc_get_orders(), $order->get_meta(), $order->update_meta_data() més $order->save()), actualitza els hooks d’administració per a la nova pantalla de comandes i declara la compatibilitat amb HPOS als teus plugins.
Símptomes
- Els meta de comanda que llegeix el codi a mida arriben buits després d’activar HPOS.
- Falten columnes, filtres o caixes meta personalitzats a la nova pantalla de comandes.
- Les exportacions, els informes o les integracions deixen d’incloure les comandes noves.
- Els valors que desa el codi a mida no apareixen a la comanda, o desapareixen amb el desament següent.
- WooCommerce avisa que hi ha plugins actius incompatibles i no et deixa canviar a HPOS.
Causes més habituals
| Patró | Per què falla |
|---|---|
get_post_meta( $order_id, '_my_key', true ) |
Llegeix wp_postmeta, que no és la font de veritat amb HPOS |
update_post_meta( $order_id, … ) |
Escriu a l’emmagatzematge d’entrades; HPOS no ho veu, o la sincronització ho sobreescriu |
new WP_Query( [ 'post_type' => 'shop_order' ] ) / get_posts() |
Consulta wp_posts, on potser no existeixen les comandes noves |
Consultes $wpdb sobre wp_posts / wp_postmeta per a comandes |
Esquema antic escrit a mà |
wp_insert_post() / wp_update_post() sobre comandes |
Se salta els magatzems de dades de comandes |
Només manage_edit-shop_order_columns |
Hooks de la pantalla antiga; la pantalla d’HPOS en fa servir d’altres |
add_meta_box( …, 'shop_order' ) |
ID de pantalla incorrecte per a la pantalla d’edició d’HPOS |
Diagnosi
1. Comprova quin emmagatzematge és el principal
WooCommerce → Paràmetres → Avançat → Característiques mostra si les comandes es desen a les taules d’HPOS o a les antigues taules d’entrades, i si el mode de compatibilitat els manté sincronitzats. Mentre la sincronització és activa, el codi antic pot semblar que funciona en llegir, cosa que amaga el problema fins que es desactiva.
2. Busca al codi
Busca al tema, als plugins a mida, als mu-plugins i als plugins de snippets:
$ grep -rnE "get_post_meta|update_post_meta|delete_post_meta|wp_insert_post|wp_update_post" wp-content/themes/my-theme wp-content/plugins/my-plugin
$ grep -rnE "shop_order|wp_posts|wp_postmeta|post_type *=" wp-content/themes/my-theme wp-content/plugins/my-pluginCada resultat requereix una decisió: toca comandes? El codi de productes i pàgines no queda afectat.
3. Revisa les extensions
WooCommerce llista els plugins incompatibles a la pantalla de Característiques. Per a cadascun, comprova si alguna actualització declara la compatibilitat; si no, pregunta al desenvolupador o planifica un substitut.
4. Prova a staging amb la sincronització activada i després desactivada
Activa HPOS a staging amb el mode de compatibilitat, recorre els fluxos crítics (checkout, notificacions de pagament, correus, edicions a l’administració, exportacions, integracions) i després desactiva la sincronització i torna-los a recórrer. El codi que només funciona amb la sincronització activada no és compatible.
Registres i comprovacions tècniques
- La pantalla de Característiques: emmagatzematge principal, estat de la sincronització, plugins incompatibles.
- WooCommerce → Estat → Registres:
fatal-errorsdesprés de canviar d’emmagatzematge. - Notes i meta de comandes de prova, comparats abans i després del canvi.
- Comparacions de només lectura de la mateixa comanda als dos emmagatzematges mentre la sincronització és activa.
Solucions
Llegeix i escriu comandes amb l’API de comandes
// Llegir
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
$po_number = $order->get_meta( '_po_number' );
// Escriure: els canvis no es desen fins que es crida save()
$order->update_meta_data( '_po_number', sanitize_text_field( $value ) );
$order->save();
// Consultar
$orders = wc_get_orders( [
'status' => [ 'wc-processing' ],
'limit' => 50,
'meta_query' => [
[ 'key' => '_po_number', 'compare' => 'EXISTS' ],
],
] );Dona suport a les dues pantalles d’administració
use Automattic\WooCommerce\Utilities\OrderUtil;
// Columnes: pantalla antiga i pantalla d’HPOS
add_filter( 'manage_edit-shop_order_columns', 'myplugin_add_column' );
add_filter( 'manage_woocommerce_page_wc-orders_columns', 'myplugin_add_column' );
add_action( 'manage_shop_order_posts_custom_column', function ( $column, $post_id ) {
myplugin_render_column( $column, wc_get_order( $post_id ) );
}, 10, 2 );
add_action( 'manage_woocommerce_page_wc-orders_custom_column', function ( $column, $order ) {
myplugin_render_column( $column, $order );
}, 10, 2 );
// Caixa meta a la pantalla d’edició de comandes que estigui activa
add_action( 'add_meta_boxes', function () {
add_meta_box( 'myplugin-box', 'Ordre de compra', 'myplugin_render_box', wc_get_page_screen_id( 'shop-order' ), 'side' );
} );
function myplugin_render_box( $post_or_order ) {
$order = $post_or_order instanceof WP_Post ? wc_get_order( $post_or_order->ID ) : $post_or_order;
// …
}Declara la compatibilitat als teus propis plugins
add_action( 'before_woocommerce_init', function () {
if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
}
} );Què no s’ha de fer
- No declaris la compatibilitat per treure l’avís abans de revisar el codi.
- No desactivis el mode de compatibilitat just després del canvi: mantén-lo com a camí de tornada enrere fins que la botiga porti un temps funcionant bé.
- No «arreglis» els valors que falten copiant meta entre taules amb SQL.
Quan recórrer a un expert
Recorre a un enginyer quan l’auditoria troba accessos a comandes repartits per molts fitxers, quan una extensió imprescindible no té versió compatible, quan les dades de comandes ja difereixen entre emmagatzematges, o quan la botiga és prou gran perquè la mateixa migració necessiti planificació.
Problemes relacionats
- WooCommerce / Comandes Comandes de WooCommerce que no apareixen o són incorrectes Abans de donar una comanda per perduda, revisa tots els estats, els esborranys i el proveïdor de pagaments. Els totals incorrectes solen venir d’impostos, càrrecs, cupons o recàlculs.
- WooCommerce / Errors Error fatal a WooCommerce: guia pràctica per resoldre’l Llegeix bé l’error fatal (fitxer, línia, traça) i relaciona’l amb el canvi que el va provocar.
- WooCommerce / Errors Conflicte de plugins a WooCommerce: com trobar la causa Parteix de les evidències (l’error, el moment, la petició) i aïlla a staging per meitats, no plugin a plugin a producció.
Preguntes freqüents
Com sé si el meu codi és compatible amb HPOS?
Busca accessos directes a comandes: get_post_meta i update_post_meta sobre IDs de comanda, WP_Query o get_posts amb shop_order, wp_insert_post per a comandes i SQL contra wp_posts o wp_postmeta per a comandes. El codi que només fa servir wc_get_order, wc_get_orders i els mètodes de l’objecte comanda sol ser compatible.
Per què desapareix la meva columna personalitzada de la llista de comandes?
La pantalla de comandes d’HPOS és una altra pàgina d’administració amb altres hooks. Les columnes registrades amb manage_edit-shop_order_columns també necessiten els seus equivalents manage_woocommerce_page_wc-orders_columns.
He de declarar la compatibilitat?
Sí, als teus propis plugins. WooCommerce fa servir aquesta declaració per decidir si es pot activar HPOS. Declara-la només després de revisar el codi.
Puc continuar executant SQL sobre les comandes?
Millor fes servir wc_get_orders(). Si de veritat necessites SQL, obtén els noms de taula de WooCommerce en lloc d’escriure wp_posts a mà, i recorda que l’esquema és diferent a cada emmagatzematge.