Я использую плагин платного членства pro для управления членством на разрабатываемом новостном сайте с пользовательской страницей регистрации, которая ведет к пользовательской странице цен (уровней) после успешной регистрации, которая использует встроенную js-библиотеку paystack вместо платежного шлюза для обработки платежей и после успешной оплаты класс MemberOrder используется для создания заказа, а также для обновления уровня членства пользователя.
Проблема, с которой мы сталкиваемся сейчас, заключается в том, что если пользователь подписывается на план членства с продолжительностью 30 дней, после проверки раздела «Заказы» в настройках платного членства Pro дата регистрации и начала назначаются успешно и точно, но дата окончания устанавливается на «Никогда» вместо даты 30 дней от Даты начала. Как это можно исправить, так как я безуспешно просмотрел всю документацию по платному членству.
Дата окончания заказа должна быть установлена на дату через 30 дней после Даты начала, а не на «Никогда».
// Update the membership level for the user
pmpro_changeMembershipLevel(substr($decrypted_data, 19, 1), $user_id); // Change membership level
if (!$order->payment_transaction_id) {
// Query to check if order_id/payment_transaction_id already exists in database, in the event someone is trying to reuse a successful payment ID
$order->code = $order_id;
$order->user_id = $user_id;
$order->payment_transaction_id = $order_id;
$order->total = $membership_amount;
$order->membership_id = substr($decrypted_data, 19, 1);
$order->gateway = 'PayStack';
$order->status = 'success';
// Save object
$order->saveOrder();
}
Попробуй это:
// Update the membership level for the user
$level_id = substr($decrypted_data, 19, 1);
pmpro_changeMembershipLevel($level_id, $user_id); // Change membership level
// Get the level details to calculate the End Date
$level = pmpro_getLevel($level_id);
if ($level->expiration_number > 0) {
$end_date = date('Y-m-d', strtotime("+{$level->expiration_number} {$level->expiration_period}", current_time('timestamp')));
} else {
$end_date = '0000-00-00 00:00:00';
}
if (!$order->payment_transaction_id) {
// Query to check if order_id/payment_transaction_id already exists in database, in the event someone is trying to reuse a successful payment ID
$order->code = $order_id;
$order->user_id = $user_id;
$order->payment_transaction_id = $order_id;
$order->total = $membership_amount;
$order->membership_id = $level_id;
$order->gateway = 'PayStack';
$order->status = 'success';
$order->enddate = $end_date; // Set the End Date for the order
// Save object
$order->saveOrder();
}
Он извлекает сведения об уровне членства, используя pmpro_getLevel($level_id), а затем вычисляет дату окончания на основе номера истечения срока действия и периода.
@Noel Bürgler Спасибо за ваш ответ, но он не может работать, поскольку класс MemberOrder не имеет свойства enddate. Тем не менее, я смог решить эту проблему после небольшого возни, и я решил поделиться ответом здесь, поскольку я заметил довольно много людей, сталкивающихся с одной и той же проблемой и не желающих платить за поддержку PMPRO только за это.
Ниже показано, как проблема была решена мной:
// First, establish a database connection
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
$conn = new mysqli($servername, $username, $password, $dbname)
$plan_id = 1; //set your plan id
$expiration_date = date('Y-m-d', strtotime('+30 days')); //set your enddate
pmpro_changeMembershipLevel($plan_id, $user_id); //update user membership level
$order = new MemberOrder();
$order->code = $decoded_data->data->id;
$order->user_id = $user_id;
$order->payment_transaction_id = $decoded_data->data->reference;
$order->total = $decoded_data->data->amount / 100;
$order->membership_id = $plan_id;
$order->gateway = 'PayStack';
$order->status = 'success';
// Save object
$order->saveOrder(); //save order
// Next, define the update query to update enddate
$sql = "UPDATE wp_pmpro_memberships_users SET enddate = '$expiration_date' WHERE user_id = '$user_id'";
// Execute the enddate update query
$conn->query($sql);
// close the database connection
$conn->close();
Надеюсь, это поможет кому-то еще решить ту же проблему, что и я :)
Да, это подход. Просто используйте глобальный $wpdb; вместо создания нового экземпляра mysqli.
Я прохожу через то же самое, и это не работает...