Решено. Ссылка на скачивание цифрового товара в письме WP Recall Commerce
Создаю клиенту сайт на базе CMS Wordpress и плагина WP Recall. Встала задача сделать так, чтобы после оплаты товара, в письме покупателю, вывести ссылку на скачивание определенного контента.
Проблема
Плагин WP Recall хорош тем, что есть много дополнений к нему и большинство бесплатных, это радует, но не радует, что разработчик удалил бесплатное дополнение, которое позволяла продавать цифровые товары и прикреплять ссылку на скачивание, а вместо него продает платный аддон за 2500 р. Я в общем-то я не против, но ради такого небольшого функционала покупать аддон не стоит.
Решение
Разумеется у вас должен быть установлен плагин WP Recall и активирован аддон Commerce.
Я вношу изменения в 2 файла:
- wp-content/plugins/wp-recall/add-on/commerce/admin/products-metabox.php
- 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());
}
Итог
Ссылка присутствует в заказе личного кабинета и это не может не радовать.
Сегодня мы решили определенно хорошую задачу. Желаю успехов в вашем проекте!