© 2008-2024 г.
Все права защищены
Алексей Костюк

Решено. Ссылка на скачивание цифрового товара в письме WP Recall Commerce

Создаю клиенту сайт на базе CMS Wordpress и плагина WP Recall. Встала задача сделать так, чтобы после оплаты товара, в письме покупателю, вывести ссылку на скачивание определенного контента.

Проблема

Плагин WP Recall хорош тем, что есть много дополнений к нему и большинство бесплатных, это радует, но не радует, что разработчик удалил бесплатное дополнение, которое позволяла продавать цифровые товары и прикреплять ссылку на скачивание, а вместо него продает платный аддон за 2500 р. Я в общем-то я не против, но ради такого небольшого функционала покупать аддон не стоит.

Решение

Разумеется у вас должен быть установлен плагин WP Recall и активирован аддон Commerce.

Я вношу изменения в 2 файла:

  1. wp-content/plugins/wp-recall/add-on/commerce/admin/products-metabox.php
  2. wp-content/plugins/wp-recall/add-on/commerce/core.php

1. Внесение изменений в products-metabox.php

Добавим новое поле download-link в функцию rcl_metabox_products. Перед кодом if ( $PrVars->variations ): вставляем:

// Добавим новое поле скачивания по ссылке
    $content .= '<div class="rcl-product-meta">';
    $content .= '<label class="meta-title">' . esc_html__( 'Ссылка на скачивание товара', 'wp-recall' ) . '</label>';
    $content .= '<div class="meta-content">';
    $content .= '<input type="text" name="wprecall[download-link]" value="' . esc_attr( get_post_meta( $post->ID, 'download-link', 1 ) ) . '">';
    $content .= '</div>';
    $content .= '</div>';

После этой функции находим функцию rcl_commerce_fields_update, которая отвечает за обновление и сохранение полей и вставляем наше поле перед return $post_id;

// Добавим новое поле скачивания по ссылке
    if ( isset( $_POST['wprecall']['download-link'] ) ) {
        $download_link = sanitize_text_field( wp_unslash( $_POST['wprecall']['download-link'] ) );
        update_post_meta( $post_id, 'download-link', $download_link );
    } else {
        delete_post_meta( $post_id, 'download-link' );
    }

Сохраняем файл, переходим в настройки товара и убеждаемся, что новое поле появилось и оно сохраняется. Для этого добавим ссылку и сохраним товар

2. Внесение изменений в core.php

Теперь когда у нас есть новое поле куда мы вставляем ссылку необходимо вывести в письме покупателю ссылку на скачивание цифрового товара. Я вношу изменения в функцию rcl_payment_order_send_mail и привожу полный ее код:

function rcl_payment_order_send_mail( $order_id ) {
    global $rclOrder;

    $rclOrder = rcl_get_order( $order_id );

    remove_action( 'rcl_order_before', 'rcl_add_order_pay_form', 30 );

    $orderData = rcl_get_include_template( 'order.php', __FILE__ );

    $userName  = get_the_author_meta( 'display_name', $rclOrder->user_id );
    $userEmail = get_the_author_meta( 'user_email', $rclOrder->user_id );

    $subject = sprintf( __( 'Order №%d has been paid', 'wp-recall' ), $rclOrder->order_id );

    // Получение списка товаров из заказа
    $products = $rclOrder->products;
    // Проверка наличия товаров и получение ID первого товара
    $product_id = !empty($products) && !empty($products[0]->product_id) ? $products[0]->product_id : null;
    error_log('Product ID: ' . $product_id); // Запись в лог для проверки ID товара
    // Получение ссылки для скачивания из мета-поля
    $download_link = $product_id ? get_post_meta( $product_id, 'download-link', true ) : '';
    $textmail = '
    <p>' . __( 'User has paid for the order', 'wp-recall' ) . ' "' . get_bloginfo( 'name' ) . '".</p>
    <h3>' . __( 'Information about the customer', 'wp-recall' ) . ':</h3>
    <p><b>' . __( 'Name', 'wp-recall' ) . '</b>: ' . $userName . '</p>
    <p><b>' . __( 'Email', 'wp-recall' ) . '</b>: ' . $userEmail . '</p>
    <p>' . sprintf( __( 'Order №%d received status "%s"', 'wp-recall' ), $order_id, rcl_get_status_name_order( 2 ) ) . '.</p>
    <h3>' . __( 'Order details', 'wp-recall' ) . ':</h3>
    ' . $orderData . '
    <p>' . __( 'Link for managing the order', 'wp-recall' ) . ':</p>
    <p>' . admin_url( 'admin.php?page=manage-rmag&order-id=' . $order_id ) . '</p>';

    rcl_mail( rcl_get_commerce_option( 'admin_email_magazin_recall', get_site_option( 'admin_email' ) ), $subject, $textmail );

    $email    = get_the_author_meta( 'user_email', $rclOrder->user_id );
    $textmail = '
    <p>' . sprintf( __( 'You paid for the order on the website "%s"', 'wp-recall' ), get_bloginfo( 'name' ) ) . '</p>
    <h3>' . __( 'Information about the customer', 'wp-recall' ) . ':</h3>
    <p><b>' . __( 'Name', 'wp-recall' ) . '</b>: ' . $userName . '</p>
    <p><b>' . __( 'Email', 'wp-recall' ) . '</b>: ' . $userEmail . '</p>
    <p>' . sprintf( __( 'Order №%d received status "%s"', 'wp-recall' ), $order_id, rcl_get_status_name_order( 2 ) ) . '.</p>
    <h3>' . __( 'Order details', 'wp-recall' ) . ':</h3>
    ' . $orderData . '
    <p>' . __( 'Ваш заказ оплачен и находится в обработке. Вы можете следить за его статусом в личном кабинете.', 'wp-recall' ) . '</p>';
    // Добавляем ссылку на скачивание, если она есть
    if ( $download_link ) {
        $textmail .= '<p>' . __( 'Скачайте ваше видео по ссылке:', 'wp-recall' ) . '</p>';
        $textmail .= '<p><a href="' . esc_url( $download_link ) . '">' . __( 'Скачать видео', 'wp-recall' ) . '</a></p>';
    } else {
        $textmail .= '<p>' . __( 'Ссылка не доступна', 'wp-recall' ) . '</p>'; // Для отладки
    }

    rcl_mail( $email, $subject, $textmail );
}

Сохраняем файл и идем проверять покупку товара.

Результат

Пришло письмо на Email и в нем видим свою ссылку 

Теперь появилась задача вывести личном кабинете в Заказах нашу ссылку, чтобы пользователь не потерял ее или случайно удалил письмо.

Вывод нашей ссылки из товара в личном кабинете WP Recall

Для этого редактируем файл wp-content/plugins/wp-recall/add-on/commerce/content/order-content.php и вносим изменения в функцию rcl_add_order_details и незабываем, что ссылку нужно выводить только в оплаченных заказах.

Полная функция с изменениями:

function rcl_add_order_details() {
    global $rclOrder;

    $content = '<div class="rcl-order-details order-before-box">';

    $content .= '<div class="title-before-box">' . esc_html__( 'Order data', 'wp-recall' ) . '</div>';

    $content .= '<div class="content-before-box">';

    $content .= '<p>' . esc_html__( 'Order', 'wp-recall' ) . ' №: ' . $rclOrder->order_id . '</p>';
    $content .= '<p>' . esc_html__( 'Order status', 'wp-recall' ) . ': ' . rcl_get_status_name_order( $rclOrder->order_status ) . '</p>';
    $content .= '<p>' . esc_html__( 'Created date', 'wp-recall' ) . ': ' . $rclOrder->order_date . '</p>';

    $content .= '</div>';

    if ( $rclOrder->order_details ) {

        $content .= '<div class="title-before-box">' . esc_html__( 'Data specified when placing the order', 'wp-recall' ) . '</div>';

        $content .= '<div class="content-before-box">';

        if ( is_array( $rclOrder->order_details ) ) {

            foreach ( $rclOrder->order_details as $k => $data ) {

                $data['slug'] = $k;

                $fieldObject = Rcl_Field::setup( $data );

                $content .= $fieldObject->get_field_value( true );
            }
        } else {
            // поддержка заказов, созданных ранее версии 16.0
            $content .= $rclOrder->order_details;
        }

        $content .= '</div>';
    }

    // Добавляем ссылку на скачивание, если заказ оплачен (order_status = 2)
    if ( $rclOrder->order_status == 2 ) {
        // Получение списка товаров из заказа
        $products = $rclOrder->products;
        if (!empty($products)) {
            foreach ($products as $product) {
                $product_id = isset($product->product_id) ? $product->product_id : null;
                if ($product_id) {
                    $download_link = get_post_meta($product_id, 'download-link', true);
                    if ($download_link) {
                        $content .= '<div class="rcl-download-link">';
                        $content .= '<p>' . __( 'Ваша ссылка на скачивание', 'wp-recall' ) . ':</p>';
                        $content .= '<p><a href="' . esc_url($download_link) . '" target="_blank">' . __( 'Скачать видео', 'wp-recall' ) . '</a></p>';
                        $content .= '</div>';
                    }
                }
            }
        } else {
            // Если нет элементов заказа
            $content .= '<p>' . __( 'Ссылки нет', 'wp-recall' ) . '</p>';
        }
    }

    $content .= '</div>';

    echo wp_kses($content, rcl_kses_allowed_html());
}

Итог

Ссылка присутствует в заказе личного кабинета и это не может не радовать.

Сегодня мы решили определенно хорошую задачу. Желаю успехов в вашем проекте!

Привет Username! Я Алексей Костюк
14 лет занимаюсь тем, что помогаю людям создавать сайты и дизайн, настраивать рекламу, продвигать проекты в Интернете. Я создал этот блог, чтобы делиться своим опытом и мыслями, а если вы хотите, то можете меня поддержать, это поможет мне создавать больше полезных статей для вас.

Похожие посты

Решено. Слайдер Swiper не прокручивает слайды если количество в slidesPerView равно количеству слайдов

Столкнулся с одним багом, а может это так задумал разработчик Swiper Slider, что если количество слайдов равно количеству указанных для показа в параметре slidesPerView, то…