В WooCommerce ссылки на продукты в деталях заказа в настоящее время ведут на страницу редактирования продукта, а не на страницу продукта в интернет-магазине. Я попытался добавить код, чтобы исправить это, и использовать
$product_link = $product ? get_permalink( $product->get_id() ) : '';
но это не работает, а также дублирует название продукта в форме сведений о заказе.
Связанный вопрос: Измените URL-адрес продукта в деталях заказа 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() );
}
}
Вот модифицированная версия вашего кода с внесенными вами изменениями: $product_link = $product ? get_permalink($product->get_id()): '';






Это ваш лучший вариант из-за отсутствия крючков/фильтров в позициях заказа. Добавьте следующую функцию в файл 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 .
Название вашего продукта по-прежнему будет заключено в ссылку редактирования, но ссылка предварительного просмотра приведет на главную страницу продукта.
Этот код в порядке и работает правильно, но отображает ошибку только в разделе доставки в деталях заказа.
Поскольку ссылку на продукт на страницах редактирования заказа администратора нельзя редактировать/фильтровать с помощью каких-либо хуков или шаблонов, вам нужно что-то немного другое с использованием 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>
jQuery('#order_line_items tr').each(function(){
jQuery(this).find('td.name a').prop('href', jQuery(this).find('input[name=product-permalink]').val());
});
</script>
<?php
endif;
}
Код находится в файле function.php вашей дочерней темы (или в плагине). Протестировано и работает.
Вы пробовали это: github.com/woocommerce/woocommerce/blob/trunk/plugins/…