WooCommerce программно создает поля пользовательских атрибутов продукта?

Я пытаюсь добавить пользовательские атрибуты продукта программно в поле 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 hook не работает, так как иногда не завершает загрузку полей полностью.

Я также пытался использовать wp действие, но безуспешно.

Как я могу заставить этот код работать, но используя другой Hook?

2

Решение

Для этого нет другого хука, который вы могли бы использовать. Но я добавил в вашу функцию отсутствующую переменную 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' );
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]