Actualizar atributos personalizados WooCommerce

2

En primer lugar, gracias por ser parte de una comunidad impresionante que me ha ayudado mil veces antes.

En mi entorno de Wordpress (tema Enfold, complemento de Woocommerce) creé un sistema para usar una encuesta como entrada para las publicaciones que se crearán instantáneamente en un sitio web de aplicaciones para usuario. Las respuestas en la encuesta se incluyen en las publicaciones generadas automáticamente (tipo 'producto'), incluidos los atributos personalizados de WooCommerce.

Escribí consultas personalizadas respondiendo a desencadenantes en mySQL - insertando & actualizando wp_posts, wp_terms, wp_postmeta, wp_term_relationships.

Todo funciona bien, excepto por una cosa: los atributos de productos personalizados de WooCommerce no se muestran instantáneamente en los filtros desplegables / de selección en el sitio web. Sin embargo, "manualmente" presionando Actualizar en la página de Wordpress hace el trabajo.

Estoy buscando una manera de replicar exactamente el 'manual' presionando Actualizar en el CMS de Wordpress. Hasta ahora, la publicación se carga con éxito en el sitio web, pero sus atributos de producto WooCommerce no están instanciados.

Hasta ahora, he intentado varias soluciones:

  • establecer mediante programación el estado de una publicación (borrador) y cambiarlo instantáneamente a una publicación publicada (publicar);
  • Uso de la programación de publicaciones de Wordpress incorporada mediante el establecimiento de una hora en la que debe publicarse;
  • llamando wp_update_post;
  • Uso de las actualizaciones programadas de Tao complemento ( enlace );
  • utilizando el plugin de WordPress PostController ( enlace )

Aún así, todos los intentos solo actualizan las publicaciones en wp_posts, aparentemente no las relaciones subyacentes / atributos personalizados del producto.

Mi única solicitud sería replicar mediante programación el hacer clic en "Actualizar" en el entorno de Wordpress CMS. Esto me ayudaría a automatizar el proceso en lugar de intervenir manualmente.

¿Podría por favor sugerirme una manera de cómo hacerlo?

¡Muchas gracias por tu tiempo!

ACTUALIZACIÓN:

Hola Tom,

Después de sumergirme en tu respuesta, todavía no entiendo.

Mis consultas actualizan / insertan todas las tablas necesarias. Prácticamente siguen todos los pasos de sus scripts de PHP referidos.

Cuando verifico un producto en el CMS, veo todos los datos, y especialmente los atributos, cargados correctamente. Cuando presiono Actualizar manualmente en el CMS y comparo los datos en las tablas mySQL antes y después de la actualización, no veo diferencias significativas. Lo único que veo es el valor de _product_attributes en wp_postmeta que es ligeramente diferente (cadena serializada).

Sin embargo, cuando experimento con este valor (al vaciarlo / cambiarlo para la publicación específica en wp_postmeta), nada cambia en los atributos, y todo sigue funcionando cuando se filtra.

Lo que me lleva a las preguntas:

  • ¿Qué sucede exactamente al presionar 'Actualizar' manualmente?
  • ¿Hay otro almacenamiento a excepción de las tablas mySQL en las que las partes están conectadas de alguna manera?
  • ¿Me sería posible 1) tomar el procedimiento de 'creación de producto' al que hizo referencia y omitirlo (como hice mis propias consultas) y luego 2) solo llamar al procedimiento exacto que se ejecuta al presionar Actualizar - ¿Para que pueda 'unir' todo sin volver a crear todas las entradas de la base de datos?
  • Si es así, ¿dónde puedo encontrar este procedimiento específico?

Tu ayuda es muy apreciada. ¡Gracias! Thom

    
pregunta Thom Rommens 17.11.2015 - 10:54

3 respuestas

4

Está bien, yo también tuve una variación de este mismo problema y te guiaré a través de él.

  

Todo funciona bien, excepto por una cosa: los atributos de productos personalizados de WooCommerce no se muestran instantáneamente en los filtros desplegables / de selección en el sitio web. Sin embargo, "manualmente" presionando Actualizar en la página de Wordpress hace el trabajo.

Al mostrar los atributos, woocommerce realiza esta función: wc_get_attribute_taxonomies () ( enlace )

En esa función, notará que está obteniendo los datos de un 'transitorio' (piense en los datos en caché, vea enlace ).

Si estás cargando datos manualmente en la base de datos, es probable que hayas perdido la carga del transitorio (que por cierto va en wp_options ). Al presionar actualizar en el panel de administración de Wordpress, ejecuta la función que actualiza el transitorio, por lo que funcionan y se muestran y no antes.

Para hacer que esto funcione, debe asegurarse de que su actualización manual de MySQL también actualice el transitorio. Para mí, agregando manualmente los atributos del producto en woocommerce, tuve que agregar una fila en wp_options con options_name _transient_wc_attribute_taxonomies y mis atributos en la matriz serializada en la columna option_value (más un identificador configurado automáticamente como sí). Pero hay otros transitorios, por lo que depende de qué función está causando el problema y qué está intentando mostrar. Puede ver cuál está perdiendo haciendo una búsqueda en MySQL para %transient% en wp_options una vez antes de hacer clic en actualizar en el panel de administración de wordpress y una vez después de comparar los datos.

    
respondido por el mevukpaul 01.04.2016 - 17:29
2

¿También está actualizando los términos dentro del producto Woocommerce? Wp_term_taxonomy y wp_woocommerce_attribute_taxonomies deben actualizarse con los términos de su taxonomía para permitir que el producto Woocommerce muestre los desplegables de variación de "Color" o "Tamaño".

Al crear un producto de Woocommerce mediante programación, las variaciones del producto deben insertarse y vincularse a los atributos existentes (taxonomías creadas dentro de Woocommerce).

Observe la clave meta de la publicación "_product_attributes" que contiene los datos del atributo. Aún deberá asociar los términos (atributos) con su producto (dentro de wp_term_taxonomy ) pero, con suerte, esto le dará una dirección para moverse.

También eche un vistazo a las funciones create_product ( enlace ) y save_variations ( enlace ) que describen cómo realiza la creación del producto y sus variaciones.

    
respondido por el Tom 17.11.2015 - 12:46
-1

Esta es una opción con código PHP:

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, 'regular_price');
}


function change_product_price( $product_id, $price ) {
    change_price_all_types( $product_id, $price ); 
    $product = wc_get_product( $product_id ); // Handling variable products

    if ( $product->is_type( 'variable' ) ) {
        // RM: Get variations which are also out of stock
        $args = array(
        'post_type'     => 'product_variation',
        'post_status'   => array( 'private', 'publish' ),
        'numberposts'   => -1,
        'orderby'       => 'menu_order',
        'order'         => 'asc',
        'post_parent'   => $product_id // $post->ID 
        );
        $variations = get_posts( $args ); 
        foreach ( $variations as $variation ) {
                change_price_all_types( $variation->ID, $price );
        }
    }
}

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

foreach($products as $product) {
    change_product_price($product->ID, 9.99);
    echo $product->ID;
}

exit;

luego vaya a phpMyAdmin y ejecute las siguientes consultas SQL (es posible que deba cambiar el nombre de su tabla en lugar de wp_).

UPDATE 'wp_postmeta'
SET 'meta_value' = ''
WHERE 'meta_key' IN ('_sale_price', '_sale_price_dates_from', '_sale_price_dates_to')
  AND 'post_id' IN
    (SELECT 'ID'
     FROM 'wp_posts'
     WHERE 'post_type' = 'product'
       AND 'post_status' = 'publish' );

Borrar caché:

DELETE
FROM 'wp_options'
WHERE ('option_name' LIKE '_transient_wc_var_prices_%'
    OR 'option_name' LIKE '_transient_timeout_wc_var_prices_%')

El código SQL se tomó de: enlace

    
respondido por el Roky 12.09.2017 - 15:10

Lea otras preguntas en las etiquetas