- Вопрос или проблема
- Ответ или решение
- Как отобразить страницу поста только для пользователей, купивших конкретный продукт в WooCommerce
- Шаг 1: Проверка на наличие доступа пользователя
- Шаг 2: Создание кастомного поля для связи продукта с постом
- Шаг 3: Создание кастомного шаблона поста
- Шаг 4: Присвоение идентификаторов продуктов постам
- Заключение
Вопрос или проблема
У меня проблемы с Woocommerce. Мне нужно продавать видео. Я создал виртуальные продукты с ссылкой на отдельный пост для каждого (без загрузки, так как предпочитаю встраивать видео на свой сайт и использовать стриминг с YouTube/Vimeo). Я хотел бы, чтобы после покупки конкретного видео пользователь получал ссылку на конкретную страницу поста. До этого момента я знаю, как это сделать. Но эта страница должна быть видима только в том случае, если он уже купил ссылку. Поэтому, если он поделится ссылкой с кем-то другим или если кто-то найдет ссылку, он не сможет увидеть встроенное видео. Я не могу сделать это с ролями, потому что мне нужно было бы создать роль для каждого видео.
Поэтому мне нужно иметь цикл, в котором я сравниваю текущий ID страницы с пользовательским ID (или пользовательским полем, которое я могу добавить к каждому продукту) каждого продукта, купленного вошедшим в систему пользователем.
если (ID текущей страницы == пользовательский ID купленного продукта) то показать содержимое поста.
Возможно ли сделать что-то подобное?
Спасибо!
Да, это возможно.
В основном, вам нужно создать шаблон темы для любого типа поста, в котором показываются видео. (Если это страница, создайте шаблон страницы; если это пользовательский тип поста, создайте шаблон для этого типа поста). Вам нужно будет разработать конкретный запрос и код в зависимости от ваших плагинов, но в основном:
<?php
// Сначала проверьте, вошел ли пользователь в систему
if(is_user_logged_in()) {
// Если он вошел, покажите общий заголовок сайта
get_header();
// Если он вошел, купил ли он этот конкретный продукт?
// Сначала определите ID продукта
// Затем проверьте, купил ли он этот продукт,
// и сохраните это в переменную под названием $user_has_purchased
// Затем добавьте условия для тех, кто купил его, и для тех, кто нет
// Если они купили:
if($user_has_purchased == true) {
// Теперь добавьте ваш код для показа содержимого, которое может быть просто the_content
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_content();
endwhile;
endif;
} else {
// Else здесь означает, что они вошли в систему, но не купили
// Вы можете либо показать им сообщение со ссылкой, либо автоматически перенаправить
// на страницу продукта, чтобы побудить их купить это
echo "Извините, это содержимое доступно только по покупке.";
}
// Покажите общий нижний колонтитул сайта
get_footer();
} else {
// Else здесь означает, что они не вошли в систему
// Поэтому вы можете либо связать с формой авторизации, либо перенаправить их туда
wp_redirect( wp_login_url() ); exit;
}
?>
(Обратите внимание, что заголовок и нижний колонтитул показываются только если пользователь вошел в систему, потому что “else” говорит о перенаправлении их. Вы не можете перенаправить их, если уже вывели заголовок.)
Возможно, будет проще, если ваши страницы показа видео будут все пользовательским типом поста. Поскольку у вас есть single-posttype.php
, настроенный с этими условиями, каждый раз, когда вы создаете один из этих CPT, он всегда будет проверять на вход в систему и покупку. Если же вы создадите шаблон страницы, который нужно будет применять вручную для каждой страницы, будет легче случайно забыть установить шаблон, и таким образом сделать ваше содержимое доступным для всех.
Следуя примеру WebElaine для части $user_has_purchased:
Создайте поле объекта поста, которое принимает только продукты и прикрепите его к пользователю. Теперь вы можете помещать конкретные продукты, которые покупает пользователь, в это поле. Когда пользователь переходит на страницу конкретного продукта, вы можете сделать запрос к текущему пользователю и проверить это поле, чтобы увидеть, содержит ли оно ID текущего продукта.
Ответ или решение
Как отобразить страницу поста только для пользователей, купивших конкретный продукт в WooCommerce
Ваша задача состоит в том, чтобы настроить отображение страниц с видео таким образом, чтобы к ним имели доступ только те пользователи, которые приобрели соответствующие виртуальные продукты. Я предоставлю шаги, которые помогут вам это сделать, с учетом всех ключевых аспектов, включая проверку покупок пользователей и создание кастомного шаблона.
Шаг 1: Проверка на наличие доступа пользователя
Первый шаг заключается в проверке, является ли пользователь залогинившимся и купил ли он конкретный продукт. Для этого можно использовать функцию woocommerce_order_get_items
, чтобы проверить, есть ли у текущего пользователя активные покупки.
Шаг 2: Создание кастомного поля для связи продукта с постом
Чтобы сопоставить видео с продуктами, создайте новое кастомное поле для ваших постов. Это поле будет хранить идентификатор продукта, чтобы мы могли легко проверять, был ли этот продукт куплен пользователем.
В вашем коде это может выглядеть так:
function is_user_eligible_for_video($user_id, $product_id) {
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'status' => 'completed',
));
foreach ($orders as $order) {
foreach ($order->get_items() as $item) {
if ($item->get_product_id() == $product_id) {
return true;
}
}
}
return false;
}
Шаг 3: Создание кастомного шаблона поста
Создайте файл шаблона для ваших страниц с видео. Например, если ваши видео размещены в кастомном пост-типе video
, создайте файл single-video.php
. В этом файле добавьте следующий код:
<?php
// Проверка на залогиненность пользователя
if (is_user_logged_in()) {
get_header();
// Получение текущего поста
global $post;
$current_product_id = get_post_meta($post->ID, 'related_product_id', true);
// Проверка, купил ли пользователь продукт
if (is_user_eligible_for_video(get_current_user_id(), $current_product_id)) {
// Если пользователь купил продукт, отображаем контент
if (have_posts()) :
while (have_posts()) : the_post();
the_content();
endwhile;
endif;
} else {
// Показать сообщение, если пользователь не купил продукт
echo "<p>Извините, этот контент доступен только после покупки.</p>";
}
get_footer();
} else {
// Перенаправление на страницу входа для незалогиненных пользователей
wp_redirect(wp_login_url());
exit;
}
?>
Шаг 4: Присвоение идентификаторов продуктов постам
При создании каждого видео-поста вам нужно будет установить значение кастомного поля, которое ссылается на ID соответствующего продукта. Это можно сделать вручную на экране редактирования поста или с помощью кастомного метабокса.
Заключение
Данная реализация подходит для передачи доступа к контенту только тем пользователям, которые приобрели связанные продукты. Система, основанная на проверки продукта через WooCommerce, позволяет автоматически управлять доступом на основе истории покупок пользователя. Обратите внимание, что безопасность в этом подходе имеет первостепенное значение, и стоит использовать HTTPS для защиты данных пользователей.
Используя предложенные шаги, вы сможете эффективно управлять доступом к вашим видео и сделать процесс покупки более безопасным и удобным.