将 WooCommerce 订单项目管理产品链接更改为产品永久链接(前端)

问题描述 投票:0回答:2

在 WooCommerce 中,订单详细信息中的产品链接当前指向产品编辑页面,而不是网店中的产品页面。我尝试添加一些代码来解决这个问题并使用

$product_link = $product ? get_permalink( $product->get_id() ) : '';

但它不起作用,而且还会复制订单详细信息表单上的产品标题。

相关问题: 更改 woocommerce 订单详细信息中的产品网址

add_action( 'woocommerce_before_order_itemmeta', 'custom_order_item_product_link', 10, 3 );
function custom_order_item_product_link( $item_id, $item, $product ) {
    if ( ! is_a( $product, 'WC_Product' ) ) {
        return;
    }
    $product_link = $product->is_visible() ? $product->get_permalink() : '';
    if ( $product_link ) {
        printf( '<a href="%s">%s</a>', esc_url( $product_link ), esc_html( $product->get_name() ) );
    } else {
        echo esc_html( $product->get_name() );
    }
}
php wordpress woocommerce admin orders
2个回答
0
投票

由于订单项目中缺少挂钩/过滤器,这是您的最佳选择。 在您的活动主题functions.php中添加以下函数

add_action('woocommerce_before_order_itemmeta','woo_order_item_preview_product_link',10 ,3);
function woo_order_item_preview_product_link($item_id,$item,$product) {
    echo '- <a href="'.get_the_permalink($product->get_id()).'">Preview product</a>';
}

每个订单项目将如下所示:

Product name - Preview link
。 您的产品名称仍然会包含在编辑链接中,但预览链接将引导至首页产品页面。


0
投票

由于管理订单编辑页面中的产品链接无法通过任何挂钩或模板进行编辑/过滤,因此您需要使用 JavaScript 进行一些不同的操作,以便能够将此管理产品链接更改为前端产品永久链接。

尝试以下方法(也适用于 HPOS)

add_action( 'woocommerce_before_order_itemmeta', 'add_admin_order_item_product_permalink', 10, 2 );
function add_admin_order_item_product_permalink( $item_id, $item ) {
    if( $item->get_type() !== 'line_item' ) 
        return;

    $product = $item->get_product();

    // Add a hidden input field with the product permalink
    printf( '<input type="hidden" name="product-permalink" value="%s">', esc_url($product->get_permalink()));
}

// Change order items admin product link to the product (frontend) permalink
add_filter( 'admin_footer', 'admin_order_items_with_product_permalink_js' );
function admin_order_items_with_product_permalink_js() {
    global $pagenow, $typenow; 

    if ( ( $pagenow === 'post.php' && $typenow === 'shop_order' ) 
    || ( $pagenow === 'admin.php' && isset($_GET['page'])  && isset($_GET['action']) 
    && $_GET['page'] === 'wc-orders' && $_GET['action'] === 'edit' ) ) :
    ?>
    <script>
    function changeLineItemProductLink(){
        jQuery('#order_line_items tr').each(function(){
            jQuery(this).find('td.name a').prop('href', jQuery(this).find('input[name=product-permalink]').val());
        });
    }
    changeLineItemProductLink();
    </script>
    <?php
    endif;
}

代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。

© www.soinside.com 2019 - 2024. All rights reserved.