Изменить ссылку администратора продукта заказа товаров WooCommerce на постоянную ссылку продукта (интерфейс)

В 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() );
    }
}

Вы пробовали это: github.com/woocommerce/woocommerce/blob/trunk/plugins/…

Tanbir Ahmod 17.05.2024 12:20

Вот модифицированная версия вашего кода с внесенными вами изменениями: $product_link = $product ? get_permalink($product->get_id()): '';

suraj 17.05.2024 12:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это ваш лучший вариант из-за отсутствия крючков/фильтров в позициях заказа. Добавьте следующую функцию в файл 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 . Название вашего продукта по-прежнему будет заключено в ссылку редактирования, но ссылка предварительного просмотра приведет на главную страницу продукта.

Этот код в порядке и работает правильно, но отображает ошибку только в разделе доставки в деталях заказа.

user22774038 17.05.2024 17:46
Ответ принят как подходящий

Поскольку ссылку на продукт на страницах редактирования заказа администратора нельзя редактировать/фильтровать с помощью каких-либо хуков или шаблонов, вам нужно что-то немного другое с использованием 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 вашей дочерней темы (или в плагине). Протестировано и работает.

Другие вопросы по теме