Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否以编程方式创建产品自定义属性字段?_Php_Wordpress_Woocommerce_Attributes_Variations - Fatal编程技术网

Php 是否以编程方式创建产品自定义属性字段?

Php 是否以编程方式创建产品自定义属性字段?,php,wordpress,woocommerce,attributes,variations,Php,Wordpress,Woocommerce,Attributes,Variations,我试图以编程方式在URL字段下添加产品自定义属性,如图所示: 我已经能够使用以下代码通过transition\u post\u 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_g

我试图以编程方式在URL字段下添加产品自定义属性,如图所示:

我已经能够使用以下代码通过
transition\u post\u 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\u post\u status
hook工作得并不好,因为它有时不能完全完成字段的加载

我也尝试过使用
wp
操作,但没有成功

除了使用不同的钩子,我如何才能使此代码正常工作?

没有其他钩子可供使用。但我已在函数中添加了缺少的变量
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\u-loaded
hook触发
transition\u-post\u-status
一次,因为这个hook在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' );
    }
}