Изменить ссылку на продукт цикла WooCommerce на основе настраиваемого поля

Я пытаюсь создать код для изменения URL-адреса продукта в цикле магазина.

Поэтому я создал следующий код, но он не работает должным образом. Цель состоит в том, чтобы мы могли ввести пользовательский URL-адрес для определенных продуктов, а затем, когда покупатель нажимает на этот продукт в цикле магазина, он перенаправляется на этот пользовательский URL-адрес.

Это моя текущая версия:

add_action( 'woocommerce_product_options_advanced', 'woostore_custom_product_link' );
function woostore_custom_product_link() {
    global $woocommerce, $post;
 
    echo '<div class = "options_group">';
  
    woocommerce_wp_text_input( 
        array( 
            'id'          => '_custom_url', 
            'label'       => __( 'Custom Page link', 'actions-pro' ), 
            'placeholder' => 'http://',
            'desc_tip'    => 'true',
            'description' => __( 'Enter the custom product page url for this product to link to from the shop page.', 'actions-pro' ) 
        )
    );
  
    echo '</div>';
}

// Save Field
add_action( 'woocommerce_process_product_meta', 'woostore_link_to_custom_product_save' );
function woostore_link_to_custom_product_save( $post_id ) {
    if ( ! empty( $_POST['_custom_url'] ) ) {
        update_post_meta( $post_id, '_custom_url', esc_attr( $_POST['_custom_url'] ) );
    } else {
        update_post_meta( $post_id, '_custom_url', esc_attr( $_POST['_custom_url'] ) );
    }
}

add_action( 'init', 'woostore_product_change_link' );
function woostore_product_change_link() {
    global $post, $product;
    if ( get_post_meta( $post->ID, '_custom_url', true ) ) {
        remove_action( 'woocommerce_before_shop_loop_item', 'woocommerce_template_loop_product_link_open', 10 );
        
        add_action( 'woocommerce_before_shop_loop_item', 'woostore_template_loop_product_link_open', 1 );
    }
}

Я не получил никакой ошибки. Немного не работает на моей стороне. Любой совет?

Стоит ли изучать 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
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Некоторые комментарии/предложения относительно вашей попытки кода

  • Используйте фильтр woocommerce_loop_product_link вместо init, таким образом вам не нужно удалять/добавлять хуки
  • Для сохранения полей можно использовать хук woocommerce_admin_process_product_object, напротив устаревшего хука woocommerce_process_product_meta
  • Нет необходимости использовать глобальные переменные

Итак, вы получаете:

function action_woocommerce_product_options_advanced() {  
    woocommerce_wp_text_input( 
        array( 
            'id'          => '_custom_url', 
            'label'       => __( 'Custom Page link', 'actions-pro' ), 
            'placeholder' => 'http://',
            'desc_tip'    => 'true',
            'description' => __( 'Enter the custom product page url for this product to link to from the shop page.', 'actions-pro' ) 
        )
    );
}
add_action( 'woocommerce_product_options_advanced', 'action_woocommerce_product_options_advanced' );

// Save custom field
function action_woocommerce_admin_process_product_object( $product ) {
    // Isset
    if ( isset( $_POST['_custom_url'] ) ) {        
        // Update
        $product->update_meta_data( '_custom_url', sanitize_url( $_POST['_custom_url'] ) );
    }
}
add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object', 10, 1 );

// Custom url
function filter_woocommerce_loop_product_link( $the_permalink, $product ) {
    // Get meta value
    $url = $product->get_meta( '_custom_url' );

    // NOT empty
    if ( ! empty ( $url ) ) {
        $the_permalink = $url;
    }

    return $the_permalink;
}
add_filter( 'woocommerce_loop_product_link', 'filter_woocommerce_loop_product_link', 10, 2 );

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

Похожие вопросы

Как я могу проверить в PHP, находится ли индекс ассоциативного массива в последовательности или нет, и вызвать исключение, если индексированный массив не в последовательности?
Как сделать задание на сохранение объекта в формате json в базе данных в Laravel?
Конкретная функция для массива Unflatten
Когда я пытаюсь запустить свой код в Chrome, я вижу код, который я сделал в phpstorm, а не функцию, которую он должен выполнять
Какой формат отметки времени это 1651928421543667000
Ваши требования не могут быть разрешены для устанавливаемого набора пакетов, я получаю эту ошибку, когда пытаюсь установить livewire
Как создавать вложенные формы в Symfony
Как предотвратить повторение одного и того же значения параметра выбора в цикле php
Как отобразить сообщение об ошибке или перенаправить пользователя на страницу, если идентификатор отслеживания неверен или недействителен
Мне не удается передать информацию (объект) с помощью Ajax (Jquery)