从WooCommerce中的父变量产品设置订单商品永久链接

时间:2019-09-19 19:28:39

标签: php wordpress woocommerce hook-woocommerce orders

在“谢谢”页面和订购电子邮件中,可变产品的永久链接始终直接链接到产品版本,而不是父产品本身,例如https://mystore.com/some-product/?attribute_color=red。我需要固定链接来反映产品,而不是变化,例如https://mystore.com/some-product/

我尝试了以下操作:

$parent_id = $product->get_parent_id();
$slug = $product->get_permalink($parent_id);

变量

$parent_id

正确返回,但

$slug

始终是变体永久链接。我想念什么?另外,我尝试像这样检索父级的职位名称

$parent_id = $product->get_parent_id();
$slug = $product->get_post_name($parent_id);

但这会引发错误,并且“谢谢”页面仅会部分呈现。

1 个答案:

答案 0 :(得分:1)

您无需覆盖任何模板文件,只需使用以下挂钩函数即可在所有订单上用父变量product永久链接替换产品变体永久链接:

add_filter( 'woocommerce_order_item_permalink', 'filter_order_item_permalink_callback', 10, 3 );
function filter_order_item_permalink_callback( $product_permalink, $item, $order ) {

    // For product variations
    if( $item->get_variation_id() > 0 ){
        $product    = $item->get_product();
        $is_visible = $product && $product->is_visible();

        // Get the instance of the parent variable product Object
        $parent_product = wc_get_product( $item->get_product_id() );

        // Return the parent product permalink (if product is visible)
        return $is_visible ? $parent_product->get_permalink() : '';
    }
    return $product_permalink;
}

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试和工作。


用于电子邮件通知

默认情况下,WooCommerce不会在电子邮件通知中显示产品永久链接...

要在电子邮件通知上显示产品永久链接,请使用以下命令:

add_filter( 'woocommerce_order_item_name', 'filter_order_item_name_callback', 10, 3 );
function filter_order_item_name_callback( $item_name, $item, $is_visible ) {

    // On emails notifications only
    if( ! is_wc_endpoint_url() > 0 ) {
        $product = $item->get_product();

        // For product variation type
        if( $item->get_variation_id() > 0 ){

            // Get the instance of the parent variable product Object
            $parent_product = wc_get_product( $item->get_product_id() );

            // The parent product permalink (if product is visible)
            $product_permalink = $parent_product->get_permalink();
        } 
        // For other item (product) type
        else {
            $product_permalink = $product->get_permalink();
        }

        return sprintf( '<a href="%s">%s</a>', $product_permalink, $item_name );
    }
    return $item_name;
}

代码进入活动子主题(或活动主题)的functions.php文件中。经过测试和工作。