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