无法获取具有某些‘product_cat’的帖子。WP_Query为空

时间:2019-06-12 作者:Shipso

我想为特定产品类别中的woocommerce产品设置属性。然而,这个查询似乎不起作用。

我已将以下代码放入函数中。我的孩子主题的php。尝试用term\\u id替换slug,尝试添加“relation”,以防万一,尝试显式设置slug而不是变量,但仍然没有成功。

function wccategory_set_attributes($categoryslug, $attributes) {
    $pquery = new WP_Query( array(
        \'post_type\'   => \'product\',
        \'post_status\' => \'publish\',
        \'posts_per_page\' => 10,
        \'tax_query\'   => array(
            array(
                \'taxonomy\' => \'product_cat\',
                \'field\'    => \'slug\',
                \'terms\'    => $categoryslug,
            ),
        ),
    ));

    if( $pquery->have_posts() ) { //that condition is never true with tax_query
        while ($pquery->have_posts()) : $pquery->the_post();
            foreach ($attributes as $name => $value) {
                wp_set_object_terms( $postid, $value, $name, false );
                $product_attributes[$i] = array (
                    \'name\' => htmlspecialchars( stripslashes( $name ) ),
                    \'value\' => $value,
                    \'is_visible\' => 1,
                    \'is_taxonomy\' => 0
                );
                $i++;
            }
            update_post_meta( $postid,\'_product_attributes\', $product_attributes); 
        endwhile;
    }
}
wccategory_set_attributes(\'theslug\', array ( \'pa_length\' => \'\', \'pa_width\' => \'\', \'pa_type\' => \'\'));
$pquery->have\\u posts()不返回任何内容。不过,这些帖子还是存在的。一旦我从参数中删除了“tax\\u query”,一切都会正常工作。我假设“tax\\u query”中有一些错误。我查看了许多其他示例,包括WPCodex WP\\u Query reference。看起来不错,但我好像错过了什么。我使用的WooCommerce版本是3.5.7。

1 个回复
SO网友:Alex Uleberg

This answer assumes you are using WooCommerce version 3.0 or newer.

下面是修改后的函数,以便在WooCommerce中使用新的CRUD对象。这是在更新版本的WooCommerce中编辑产品和向产品添加数据的方法。我们使用wc\\u get\\u products()来获取产品对象的数组,此函数接受各种参数,用于您可以签出的所有选项https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query. 要查看产品对象上存在哪些setter,可以签出https://docs.woocommerce.com/wc-apidocs/class-WC_Product.html.

我们还使用WC\\u Product\\u Attribute对象来创建属性。更多信息可在此处找到https://docs.woocommerce.com/wc-apidocs/class-WC_Product_Attribute.html.

有关函数功能的说明,请参见注释

function wccategory_set_attributes($categoryslug, $attributes) {
    // Get any products in the category matching the slug we pass in
    $products = wc_get_products(array(
        \'status\' => \'publish\',
        \'category\' => array($categoryslug),
    ));

    // Loop the products
    foreach($products as $product) {
        $product_attributes = array();
        foreach($attributes as $key => $val) {
            // Create a new attribute for each of the attributes we have passed to the function
            $new_attribute = new WC_Product_Attribute();

            // If attribute exists globally we set the correct attribute id
            $new_attribute->set_id(wc_attribute_taxonomy_id_by_name($key));
            $new_attribute->set_name($key);

            // Because we cast to array you can choose to pass in an array of values/options for the attribute
            $new_attribute->set_options((array)$val);
            $new_attribute->set_visible(1);
            $new_attribute->set_variation(0);

            $product_attributes[] = $new_attribute;
        }

        // Set the attributes on the product object
        $product->set_attributes($product_attributes);

        // Store the product
        $product->save();
    }
}
调用该函数(假设您有一个带有slug“theslug”的产品类别)

wccategory_set_attributes(\'theslug\', array(\'pa_length\' => \'\', \'pa_width\' => \'\'));
调用函数时,需要考虑很多事情。如果属性尚未全局创建(意味着它们不存在于WooCommerce中的Products->Attributes下),则在属性前面加上“pa\\u0”将在属性名称中包含“pa\\u0”。您可能不希望这样,您可以将“pa\\u length”替换为“length”,以此类推。像这样:

wccategory_set_attributes(\'theslug\', array(\'Length\' => \'\', \'Width\' => \'\'));
当属性不包含任何选项时,它将删除此产品存在的任何选项。如果要包含选项,可以通过传递单个值为每个选项包含一个选项,也可以传递一个选项数组。两个示例如下所示:

选项1

wccategory_set_attributes(\'theslug\', array(\'pa_length\' => \'100\', \'pa_width\' => \'500\'));
选项2

wccategory_set_attributes(\'theslug\', array(\'pa_length\' => array(\'100\', \'200\'), \'pa_width\' => array(\'500\', \'1000\')));
"type" is a reserved taxonomy name therefore you cannot create "pa_type" globally. 但是,您可以在产品上本地创建名为“Type”的产品属性。

相关推荐

付费会员专业版在PHP中显示用户名

我正在使用插件Paid Membership Pro (free version). 在标题下方,如果有用户登录到我的网站,我希望它说:欢迎使用用户名我该怎么做?以下是获取成员级别的方法:if( is_user_logged_in() && function_exists(\'pmpro_hasMembershipLevel\') && pmpro_hasMembershipLevel() ) { gl