WooCommerce 以编程方式创建产品自定义属性字段?
WooCommerce creating Product Custom Attributes fields programmatically?
我正在尝试以编程方式在 URL 字段下添加产品自定义属性,如图所示:
我已经能够使用以下代码使用 transition_post_status
操作来做到这一点:
add_action('transition_post_status', 'wpa_120062_new_product', 10, 3);
function wpa_120062_new_product($new_status, $old_status, $post){
if( function_exists( 'wc_get_attribute_taxonomies' ) && ( $attribute_taxonomies = wc_get_attribute_taxonomies() ) ) {
$defaults = array();
foreach ( $attribute_taxonomies as $key=>$tax ) {
$name = wc_attribute_taxonomy_name( $tax->attribute_name );
$value= get_post_meta( $post->ID , '_product_attributes');
$defaults[ $name ] = array (
'name' => $name,
'position' => $key+1,
'is_visible' => 1,
'is_variation' => 1,
'is_taxonomy' => 1,
);
update_post_meta( $post->ID , '_product_attributes', $defaults );
}
}
}
但这里的问题是 transition_post_status
钩子不能很好地工作,因为它有时不能完全完成字段的加载。
我也尝试过使用 wp
操作但没有成功。
如何使用不同的 Hook 使这段代码正常工作?
没有其他钩子可以用于此目的。但我已将缺少的变量 global $post
和仅过滤新创建的已发布产品的条件添加到您的函数中。
add_action('transition_post_status', 'wpa_120062_new_product', 10, 3);
function wpa_120062_new_product($new_status, $old_status, $post){
global $post;
if( $old_status != 'publish' && $new_status == 'publish' && !empty($post->ID)
&& in_array( $post->post_type, array( 'product') ) ) {
if( function_exists( 'wc_get_attribute_taxonomies' ) && ( $attribute_taxonomies = wc_get_attribute_taxonomies() ) ) {
$defaults = array();
foreach ( $attribute_taxonomies as $key=>$tax ) {
$name = wc_attribute_taxonomy_name( $tax->attribute_name );
$value= get_post_meta( $post->ID , '_product_attributes');
$defaults[ $name ] = array (
'name' => $name,
'position' => $key+1,
'is_visible' => 1,
'is_variation' => 1,
'is_taxonomy' => 1,
);
update_post_meta( $post->ID , '_product_attributes', $defaults );
}
}
}
}
此外(如果需要,但我不确定)您可以尝试使用 wp_loaded
钩子来触发 transition_post_status
一次,因为一旦 WordPress、所有插件和主题已完全加载并实例化。可以这样做:
if( function_exists( 'wpa_120062_new_product' ) {
add_action( 'wp_loaded', 'my_wp_is_loaded' );
function my_wp_is_loaded(){
do_action ( 'transition_post_status' );
}
}
我正在尝试以编程方式在 URL 字段下添加产品自定义属性,如图所示:
我已经能够使用以下代码使用 transition_post_status
操作来做到这一点:
add_action('transition_post_status', 'wpa_120062_new_product', 10, 3);
function wpa_120062_new_product($new_status, $old_status, $post){
if( function_exists( 'wc_get_attribute_taxonomies' ) && ( $attribute_taxonomies = wc_get_attribute_taxonomies() ) ) {
$defaults = array();
foreach ( $attribute_taxonomies as $key=>$tax ) {
$name = wc_attribute_taxonomy_name( $tax->attribute_name );
$value= get_post_meta( $post->ID , '_product_attributes');
$defaults[ $name ] = array (
'name' => $name,
'position' => $key+1,
'is_visible' => 1,
'is_variation' => 1,
'is_taxonomy' => 1,
);
update_post_meta( $post->ID , '_product_attributes', $defaults );
}
}
}
但这里的问题是 transition_post_status
钩子不能很好地工作,因为它有时不能完全完成字段的加载。
我也尝试过使用 wp
操作但没有成功。
如何使用不同的 Hook 使这段代码正常工作?
没有其他钩子可以用于此目的。但我已将缺少的变量 global $post
和仅过滤新创建的已发布产品的条件添加到您的函数中。
add_action('transition_post_status', 'wpa_120062_new_product', 10, 3);
function wpa_120062_new_product($new_status, $old_status, $post){
global $post;
if( $old_status != 'publish' && $new_status == 'publish' && !empty($post->ID)
&& in_array( $post->post_type, array( 'product') ) ) {
if( function_exists( 'wc_get_attribute_taxonomies' ) && ( $attribute_taxonomies = wc_get_attribute_taxonomies() ) ) {
$defaults = array();
foreach ( $attribute_taxonomies as $key=>$tax ) {
$name = wc_attribute_taxonomy_name( $tax->attribute_name );
$value= get_post_meta( $post->ID , '_product_attributes');
$defaults[ $name ] = array (
'name' => $name,
'position' => $key+1,
'is_visible' => 1,
'is_variation' => 1,
'is_taxonomy' => 1,
);
update_post_meta( $post->ID , '_product_attributes', $defaults );
}
}
}
}
此外(如果需要,但我不确定)您可以尝试使用 wp_loaded
钩子来触发 transition_post_status
一次,因为一旦 WordPress、所有插件和主题已完全加载并实例化。可以这样做:
if( function_exists( 'wpa_120062_new_product' ) {
add_action( 'wp_loaded', 'my_wp_is_loaded' );
function my_wp_is_loaded(){
do_action ( 'transition_post_status' );
}
}