Salta al contingut
WooRescueHQ

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:

Bash
$ 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-plugin

Cada 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-errors despré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

PHPmy-plugin/includes/orders.php
// 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ó

PHPmy-plugin/includes/admin.php
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

PHPmy-plugin/my-plugin.php
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ó.

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.

$ descriu el problema

Tens un problema amb WooCommerce?Sol·licita una diagnosi.

Explica'ns què falla, què ha canviat darrerament i com afecta el negoci. Revisem cada sol·licitud i et recomanem el pas següent.

Sol·licitar una diagnosi Veure serveis i preus

No enviïs mai contrasenyes, claus d'API ni dades de targetes a través del formulari.

Diagnosi des de299 €

Sol·licitar una diagnosi