Вопрос или проблема
У меня установлен WordPress Multisite (один домен + подпапки – каждый экземпляр для другой страны – поэтому несколько языков, но пока одна валюта – евро)
Пользователи автоматически добавляются ко всем экземплярам (с помощью “Присоединиться к моему сайту”) – так что вы можете использовать свою учетную запись на всех экземплярах.
Теперь проблема в следующем:
Мы хотим запустить платную подписку на членство (которая затем активирует скидки).
Когда пользователь покупает подписку на одном сайте, ему предоставляется план членства. Теперь вопрос: как мне автоматически активировать его на всех экземплярах?
Я думал запустить некоторый код, когда подписка будет куплена, который подарит ее тому же пользователю на всех других экземплярах.
Но, возможно, для этого существует плагин? Или что-то подобное, что я мог бы использовать в качестве основы для разработки?
Или какая-либо документация API, которая может быть полезной? Я немного не знаю, с чего начать.
Я частично решил проблему, написав плагин, в котором я генерирую шорткод, который могу использовать для программного добавления членства, если пользователь авторизован.
function wp_add_missing_membership ( $user_id, $plan_id ) {
if ( ! function_exists( 'wc_memberships' ) ) {
return;
}
$args = array(
// Введите ID (ID записи) плана для предоставления при регистрации
'plan_id' => $plan_id,
'user_id' => $user_id,
);
wc_memberships_create_user_membership( $args );
// Получить новое членство
$user_membership = wc_memberships_get_user_membership( $user_id, $args['plan_id'] );
// Добавить заметку, чтобы мы знали, как это было зарегистрировано.
$user_membership->add_note( 'Членство импортировано с другого сайта' );
}
function has_woocommerce_subscription($the_user_id, $the_product_id, $the_status) {
$current_user = wp_get_current_user();
if (empty($the_user_id)) {
$the_user_id = $current_user->ID;
}
if (WC_Subscriptions_Manager::user_has_subscription( $the_user_id, $the_product_id, $the_status)) {
return true;
}
}
function bb_fixmembership ( $atts){
$a = shortcode_atts( array('plan' => '0'), $atts );
$what_s_the_plan = $a['plan'];
if ( is_user_logged_in() ) {
$user_id = get_current_user_id();
if (wc_memberships_is_user_active_member($user_id, 'student')) {
// ничего не делать - все в порядке
} else {
wp_add_missing_membership($user_id, $what_s_the_plan);
}
}
}
add_shortcode( 'fixmembership', 'bb_fixmembership' );
Теперь мне нужно синхронизировать это с подписками на разных сайтах – что я, возможно, сделаю с помощью хуков и метаданных пользователей.
Я просто публикую ответ, поскольку не вижу, чтобы большинство вопросов были отвечены 🙂 так что думал, это может помочь кому-то другому…
Опубликую, когда полностью исправлю это.
Ответ или решение
Синхронизация подписок WooCommerce Membership на мультисайте WordPress
Существует много случаев, когда для бизнеса может потребоваться скоординированная работа мультисайтовой сети с управлением членством через WooCommerce. В данном ответе мы рассмотрим, как можно автоматически синхронизировать подписки и членские планы между различными сайтами внутри одной инсталляции WordPress с использованием мультисайтовой конфигурации.
Установка и общие положения
У вас уже есть мультисайтовая установка WordPress, настроенная на единую доменную структуру с подкаталогами для различных стран и языков. Пользователи автоматически добавляются на все сайты через функцию "Join my site", что позволяет им использовать одну учетную запись для входа на все сайты.
Проблема синхронизации
Главная задача состоит в том, чтобы при покупке подписки на одном сайте пользователь получил тот же план членства на всех других сайтах за пределами первоначального. Это создаёт необходимость в создании механизма, который будет следить за процессом покупки и реплицировать соответствующие данные о членстве на другие сайты в сети.
Решение с использованием пользовательского плагина
Ваше текущее решение, состоящее в написании пользовательского плагина для генерации шорткода, уже является отличным началом. Однако нужно развить этот подход и интегрировать синхронизацию подписок во всех инстансах. Вот общее предложение о том, как это можно организовать.
-
Хука при покупке подписки: Используйте хук, срабатывающий при успешной покупке подписки, чтобы инициировать синхронизацию. Хук
woocommerce_subscription_status_updated
будет подходящим выбором для этой цели. -
Обработка синхронизации на всех сайтах:
При создании новой подписки вызывайте функцию, которая будет путешествовать по всем сайтам в мультисайте с помощью функцииswitch_to_blog
. Это позволить вам инициировать добавление соответствующего членства на страницах других сайтов. Пример кода может выглядеть следующим образом:add_action('woocommerce_subscription_status_updated', 'sync_membership_across_sites', 10, 3); function sync_membership_across_sites($subscription, $old_status, $new_status) { if ($new_status == 'active') { $user_id = $subscription->get_user_id(); $plan_id = 'ID_вашего_плана'; // Актуальный ID вашего плана членства // Получаем все сайты в мультисайте $sites = get_sites(); foreach ($sites as $site) { switch_to_blog($site->blog_id); wp_add_missing_membership($user_id, $plan_id); restore_current_blog(); } } }
-
Мета-данные пользователей: Чтобы избежать дублирования, можете обрабатывать мета-данные пользователей и проверять их наличие на других сайтах. Таким образом, вы сможете увидеть, существует ли уже запись о членстве у пользователя, прежде чем пытаться её создать.
Обратная связь и доработка
Как вы уже упомянули, важно отслеживать статус подписки и соответствующим образом реагировать на изменения. Это можно сделать через дополнительные хуки WooCommerce и WordPress, которые позволяют вам обрабатывать события, такие как окончание подписки или её отмена.
Также стоит обратить внимание на возможные расширения WooCommerce, которые могут упростить вашу задачу. Например, существуют плагины для управления подписками и членством, такие как WooCommerce Subscriptions и WooCommerce Memberships, которые могут предлагать дополнительные функции или примеры реализации.
Заключение
Синхронизация членства в WooCommerce Membership на сайте с мультисайтовой установкой WordPress требует тщательного планирования и использования различных хуков и функций. Начав с вашего текущего решения и добавив описанные выше функции, вы сможете создать надежную и эффективную систему для управления подписками пользователей по всей вашей сети. Надеюсь, что этот ответ поможет вам в развитии вашего проекта и вдохновит на практическое решение задачи.