以编程方式更新自定义属性WooCommerce

时间:2015-11-17 作者:Thom Rommens

首先,感谢您成为一个令人印象深刻的社区的一员,这个社区曾经帮助过我一千次。

在我的Wordpress环境(Enfold theme,Woocommerce插件)中,我创建了一个系统,使用调查作为输入,在前端网站上即时创建帖子。调查中的答案包含在自动生成的帖子(类型“product”)中,包括WooCommerce自定义属性。

我在mySQL中编写了响应触发器的自定义查询-插入(&;更新wp\\u posts、wp\\u terms、wp\\u postmeta、wp\\u term\\u关系。

除了一件事之外,所有这些都可以正常工作:WooCommerce自定义产品属性不会立即显示在网站上的下拉/选择过滤器中。但是,在Wordpress页面上按“手动”更新可以完成这项工作。

我正在寻找一种在Wordpress CMS中准确复制“手动”按键更新的方法。到目前为止,帖子本身已成功加载到网站中,但其WooCommerce产品属性尚未实例化。

到目前为止,我已经尝试了许多解决方法:

以编程方式设置帖子(草稿)的状态,并立即将其更改为已发布帖子(发布)使用Tao计划更新plugin(https://nl.wordpress.org/plugins/tao-schedule-update/);https://github.com/HarriBellThomas/Wordpress_PostController)not 基础关系/自定义产品属性。

我唯一的请求是在Wordpress CMS环境中以编程方式复制点击“更新”。这将帮助我自动化过程,而不是手动干预自己。

你能告诉我怎么做吗?

非常感谢您的时间!

UPDATE:

嗨,汤姆,

在仔细研究了你的答案之后,我还是不明白。

我的查询更新/插入所有必要的表。它们实际上遵循您引用的php脚本中的所有步骤。

当我在CMS中检查产品时,我看到所有数据——尤其是属性——都已正确加载。当我在CMS中手动按Update并比较更新前后mySQL表中的数据时,我没有看到显著的差异。我唯一看到的是wp\\U Posteta中\\u product\\u属性的值,它略有不同(序列化字符串)。

然而,当我尝试使用这个值时(在wp\\U Posteta中为特定帖子清空/更改它),属性中没有任何变化,并且在过滤时仍然可以工作。

这就引出了我的问题:

手动按“更新”键时会发生什么情况

3 个回复
SO网友:mevukpaul

好的,我自己也有一个相同问题的变体,我会带你解决它。

除了一件事之外,所有这些都可以正常工作:WooCommerce自定义产品属性不会立即显示在网站上的下拉/选择过滤器中。但是,在Wordpress页面上按“手动”更新可以完成这项工作。

显示属性时,woocommerce执行以下功能:wc\\u get\\u attribute\\u taxonomies()(http://woocommerce.wp-a2z.org/oik_api/wc_get_attribute_taxonomies/)

在该函数中,您会注意到它是从“瞬态”中获取数据的(想想缓存的数据,请参见http://codex.wordpress.org/Transients_API).

如果您手动将数据上载到数据库中,很可能您没有上载瞬态(进入wp_options 顺便说一下)。通过点击Wordpress管理面板中的更新,您可以运行更新瞬态的功能,这就是为什么它们在当时而不是之前工作/显示。

要做到这一点,您需要确保手动更新MySQL也会更新瞬态。对于我来说,在woocommerce中手动添加产品属性时,我必须在wp_options 具有options_name _transient_wc_attribute_taxonomies 以及option_value 列(加上设置为“是”的自动加载ID)。但还有其他瞬态,因此这取决于导致问题的功能以及您试图显示的内容。通过MySQL搜索,您可以看到缺少了哪一个%transient% 在里面wp_options 在您单击wordpress管理面板中的更新之前和之后比较数据之前各一次。

SO网友:Tom

您是否也在更新Woocommerce产品中的条款?Wp_term_taxonomywp_woocommerce_attribute_taxonomies 两者都需要使用分类术语进行更新,以允许Woocommerce产品显示“颜色”或“大小”变化下拉列表。

以编程方式创建Woocommerce产品时,需要插入产品变体并将其绑定到现有属性中(在Woocommerce中创建的分类法)。

查看保存属性数据的post元键“\\u product\\u attributes”。您仍然需要将术语(属性)与您的产品(内部)相关联wp_term_taxonomy) 但希望这能给你一个前进的方向。

还可以查看功能create_product (https://github.com/woothemes/woocommerce/blob/master/includes/api/class-wc-api-products.php#L237) 和save_variations (https://github.com/woothemes/woocommerce/blob/master/includes/api/class-wc-api-products.php#L1692) 它们都概述了您如何创建产品及其变体。

SO网友:Roky

这是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;
然后转到phpMyAdmin并运行以下SQL查询(您可能需要更改表名,而不是wp\\u1)。

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\' );
清除缓存:

DELETE
FROM `wp_options`
WHERE (`option_name` LIKE \'_transient_wc_var_prices_%\'
    OR `option_name` LIKE \'_transient_timeout_wc_var_prices_%\')
SQL代码取自:http://www.technoedu.com/forums/topic/wordpress-solved-copy-woocommerce-products-sale-prices-to-regular-prices-and-reset-sale-prices/

相关推荐