Доброго времени суток.
Возникла такая потребность, чтобы после оплаты форма была ни кому не доступно.
То есть только 1 пользователь может приобрести доступ. Единоразовая возможность оплаты.
Может уже кто то задавался подобным вопросом и есть какое то решение?
За ранее благодарен.
Я вот пробовал так выводить, $access возвращает массив всех доступов:
Пробовал по разному сделать проверку, но в single.php не нужен данный массив. Или я что то делаю не так.
Array
(
[0] => stdClass Object
(
[aid] => 6
[access_id] => post-121
[user_id] => 1
[access_time] => 0
[access_date] => 2022-05-26 18:38:42
[access_status] => 1
)
[1] => stdClass Object
(
[aid] => 4
[access_id] => post-173
[user_id] => 1
[access_time] => 0
[access_date] => 2022-05-15 20:55:46
[access_status] => 1
)
[2] => stdClass Object
(
[aid] => 3
[access_id] => post-121
[user_id] => 5
[access_time] => 0
[access_date] => 2022-05-12 13:38:54
[access_status] => 1
)
[3] => stdClass Object
(
[aid] => 2
[access_id] => post-99
[user_id] => 1
[access_time] => 0
[access_date] => 2022-05-11 10:20:43
[access_status] => 1
)
[4] => stdClass Object
(
[aid] => 1
[access_id] => post-99
[user_id] => 4
[access_time] => 0
[access_date] => 2022-05-11 09:55:30
[access_status] => 1
)
)
Сломал всю голову, и ничего что то не выходит. Вместо $access_id я подставляю $post->ID и соответственно в массив приходят те пользователи, которые оплатили (повторюсь, нужно разрешить нажать кнопку купить первому оплатившему, потом же эти кнопки скрыть для всех).
Часть кода который я вывожу в single.php:
<hr>
<div class="_content__text">
<b>Платный контент:</b><br>
ID;
$idPrice = get_field('lessons_price');
$idPriceTwo = get_field('lessons_price_two');
$access = tmla_get_access( array(
'access_id' => $idAccess,
'access_status' => 1
) );
//vda($access);
if (tmla_is_have($idAccess, $user_ID)) {
$buy_lessons = the_field('buy_lessons');
echo $buy_lessons; ?>
<div class="author-chat-link">
<a href="?tab=chat" target="_blank">Написать репетитору</a>
</div>
<?php
} else {
if ($idPrice) {
echo '<div class="alert alert-warning" role="alert">У вас нет доступа к этому контенту!<br> Стоимость курса (для 1 ученика): ' . $idPrice . ' ₽</div>';
echo tmla_get_pay_form([
'id' => $idAccess,
'price' => $idPrice ,
]);
}
if ($idPriceTwo){
echo '<div class="alert alert-warning" role="alert">
Стоимость курса (более 1 ученика): ' . $idPriceTwo . ' ₽</div>';
echo tmla_get_pay_form([
'id' => $idAccess,
'price' => $idPriceTwo ,
]);
}
}
?>
</div>
Что приходит в массив:
Array
(
[0] => stdClass Object
(
[aid] => 2
[access_id] => post-99
[user_id] => 1
[access_time] => 0
[access_date] => 2022-05-11 10:20:43
[access_status] => 1
)
[1] => stdClass Object
(
[aid] => 1
[access_id] => post-99
[user_id] => 4
[access_time] => 0
[access_date] => 2022-05-11 09:55:30
[access_status] => 1
)
)
Вот не совсем понимаю, как нужно составить запрос, чтобы единоразово было доступно поле оплаты.
я ничего странного в результатах не вижу, вам приходят два действующих доступа на текущую публикацию потому что его уже успели приобрести, если вы перестанете предлагать возможность приобретать доступ к публикации если он уже был приобретен, то в массиве будет приходить только одно значение
меняете ваш код так
} else if(empty($access)){и получаете желаемое - форма на оплату будет выводится только в случае, если действующего доступа к публикации ни у кого больше нет
Огромное Спасибо. Вот я чего то совсем не догадался в в else дополнить не много запрос. Я на оборот все усложнял.
Я не много дополнение еще модифицировал, добавил поле в базу, куда записывает заголовок поста, в шорткод передаю заголовок, и в место ID доступа я вставляю ссылку на пост. И теперь в ЛК и в Админке можно перейти на оплаченный контент.
Появился новый вопрос.
В ЛК где выводятся публикации в шаблоне posts-list.php нужно вместо статуса "опубликовано" сделать проверку на статус оплачено или нет.
Вариант как делал проверку вывода в доступах, как выше подсказали.
global $user_ID, $TML_User_Access, $post;
foreach ( $posts as $postdata ) {
foreach ( $postdata as $post ) {
setup_postdata( $post );
$field = get_post_meta($post->ID);
$idAccess = $post->guid;
$access = tmla_get_access( array(
'access_id' => $idAccess,
'access_status' => 1
) );
if (tmla_is_have($idAccess, $user_ID )) {
echo 'Оплачено';
} else if(empty($access)) {
echo 'не оплачено';
}
}}
Но пишет что функция tmla_get_access() не объявлена, хотя я и другую функцию написал которая выводит в доступ.
Не заметил что после критической ошибки дополнение деактивировалось, и ругалось на не объявленную функцию.
Но теперь ругается на то, что в функцию tmla_is_have() передается мало аргументов. Но мне не нужно что либо выводить кроме проверки статуса.
Может я не в том направлении смотрю?
Ну вам ошибка говорит, что это не так, убедитесь, что данные которые вы передаете не пусты и соответствуют тому, что вы ожидаете.
guid - это вроде ссылка на пост, зачем ее использовать?
у вас кстати есть глобальный объект $TML_User_Access, он содержит данные по доступа текущего пользователя, необязательно на каждый пост делать запрос к БД и тащить оттуда эти данные.
Этот объект содержит в себе такие же данные как если бы вы сделали запрос на получение всех активных доступов текущего пользователя
tmla_get_access( array( 'user_id' => $user_ID, 'access_status' => 1, 'number' => - 1 ) );
Сделал все вроде правильно, но не выводится отрицательное значение.
Выводит только оплачено на все посты.
$isBuy = tmla_get_access( array(
'user_id' => $user_ID,
'access_status' => 1,
'number' => - 1,
) );
if ($isBuy) {
$accessStat = "Оплачено";
} else {
$accessStat = "Не оплачено";
}
$Table->add_row( array(
$field['date_start_lessons'][0],
$field['date_end_lessons'][0],
$content,
$accessStat
));
Доброго времени суток.
Возник еще вопрос по поводу добавления кастомных полей.
В таблице ДБ дополнения, я добавил 4 строки:
lessons_url,
lessons_title,
lessons_date_start,
lessons_start_time.
В index.php
add_action( 'rcl_success_pay', 'tmla_add_payment', 20 );
function tmla_add_payment( $payData ) {
if ( $payData->pay_type != 'tml-access' ) {
return false;
}
$custom = $payData->baggage_data;
tmla_insert_access( array(
'lessons_url' => $custom->lessons_url,
'lessons_title' => $custom->lessons_title,
'lessons_date_start' => $custom->lessons_date_start,
'lessons_start_time' => $custom->lessons_start_time,
'access_id' => $custom->access_id,
'user_id' => $payData->user_id,
'access_time' => $custom->access_time,
) );
if ( $payData->current_connect == 'user_balance' ) {
//если оплата с баланса пользователя
wp_send_json( [
'success' => __( 'Успешная оплата!' ),
'reload' => true
] );
}
}
function tmla_get_pay_form( $atts, $content = null ) {
global $post, $user_ID;
$lessons_start_time= get_post_meta( $post->ID, 'time_start_lessons', true);
$lessons_date_start = get_post_meta( $post->ID, 'date_start_lessons', true);
extract( shortcode_atts( array(
'id' => 'default',
'days' => 0,
'hours' => 0,
'minutes' => 0,
'secs' => 0,
'price' => 0
), $atts ) );
if ( ! $price || tmla_is_have( $id, $user_ID ) ) {
return false;
}
$secs += $minutes * 60;
$secs += $hours * 3600;
$secs += $days * 3600 * 24;
$notice = '';
if ( isset( $content ) ) {
$content = do_shortcode( shortcode_unautop( $content ) );
if ( '</p>' == substr( $content, 0, 4 )
and '<p>' == substr( $content, strlen( $content ) - 3 ) ) {
$content = substr( $content, 4, strlen( $content ) - 7 );
}
$notice = '<div class="access-form-description">'
. $content
. '</div>';
}
$content = '<div class="tmla-form">'
. $notice
. rcl_get_pay_form( array(
'pay_summ' => $price,
'pay_type' => 'tml-access',
'pay_systems_not_in' => array( 'yandexdengi' ),
'description' => 'Оплата доступа к публикации "' . $post->post_title . '"',
'user_id' => $user_ID,
'baggage_data' => array(
'lessons_url' => $post->guid,
'lessons_title' => $post->post_title,
'lessons_date_start' => $lessons_date_start,
'lessons_start_time' => $lessons_start_time,
'access_id' => $id,
'access_time' => $secs,
'post_id' => $post->ID
)
) )
. '</div>';
return $content;
}
Так же прописал в class-tml-access.php.
function __construct() {
$table = array(
'name' => WP_PREFIX . "tml_access",
'as' => 'tml_access',
'cols' => array(
'aid',
'lessons_url',
'lessons_title',
'lessons_date_start',
'lessons_start_time',
'access_id',
'user_id',
'access_time',
'access_date',
'access_status',
)
);
parent::__construct( $table );
}
На странице оплаты следующее:
$idAccess = $post->post_name;
$lessonsUrl = $post->guid;
$lessons_title = $post->post_title;
$lessons_start_time = get_post_meta( $post->ID, 'time_start_lessons', true);
$lessons_date_start = get_post_meta( $post->ID, 'date_start_lessons', true);
$idPrice = get_field('lessons_price');
echo '<div class="tmla-form-one"><div class="alert alert-warning" role="alert">У вас нет доступа к этому контенту!<br> Стоимость занятия (на одного ученика): ' . $idPrice . ' ₽</div>' . tmla_get_pay_form([
'id' => $idAccess,
'lessons_url' => $lessonsUrl,
'lessons_title' => $lessons_title,
'lessons_start_time' => $lessons_start_time,
'lessons_date_start' => $lessons_date_start,
'price' => $idPrice,
]) . '</div>';
Суть проблемы в том, что при оплате через онлайн платеж.
Проходит с ошибкой, деньги списывает, но на сайте платеж не проходит и в ДБ не вносятся данные.
При оплате же с личного счета все работает отлично.
Может я не туда прописал?
За ранее благодарен!
возможно, длина поля baggage_data с вашими данными получается слишком большой и платежка режет ее, в результате часть данных теряется
зачем туда передавать заголовок публикации и урл? можно же просто ее ID передать и далее получить нужные данные из этого ID, в том числе дату начала и конца, они же в метаданных этой публикации лежат
Мне нужно, чтобы в функцию tmla_tab() передавались все эти поля. По дефолту у вас выводится не кликабельный ИД доступа.
Но в эту функцию пробую передать переменную $post_id, возвращает пустую строку.
Потом я попробовал по другому обыграть через $post_id = get_post($access->access_id) возвращает NULL.
Далее попробовал переиграть так $post_id = get_post($access), то возвращает следующее:
WP_Post Object
(
[ID] => 0
[post_author] => 0
[post_date] => 0000-00-00 00:00:00
[post_date_gmt] => 0000-00-00 00:00:00
[post_content] =>
[post_title] =>
[post_excerpt] =>
[post_status] => publish
[comment_status] => open
[ping_status] => open
[post_password] =>
[post_name] =>
[to_ping] =>
[pinged] =>
[post_modified] => 0000-00-00 00:00:00
[post_modified_gmt] => 0000-00-00 00:00:00
[post_content_filtered] =>
[post_parent] => 0
[guid] =>
[menu_order] => 0
[post_type] => post
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
[aid] => 11
[lessons_url] =>
[lessons_title] =>
[lessons_date_start] =>
[lessons_start_time] =>
[access_id] => testovoe-oplaty
[user_id] => 1
[access_time] => 0
[access_date] => 2022-07-08 10:01:24
[access_status] => 1
)
смысла передавать эти данные в платежку у вас нет, достаточно передать только ИД закрытой публикации, когда получите ответ от платежки об оплате, получите этот ИД из ответа и по нему получите все необходимые вам данные: заголовок, урл, время начала/конца и тп и делайте дальше с ними что хотите
если вы хотите передавать ИД текущей записи, т.е. той на которой выводится форма оплаты, то baggage_data уже должен содержать post_id, проверьте
ну или вы можете сами добавить как написали выше
не понял про доп. поле в базе, вы просто получите этот айдишник в ответе от платежки внутри функции tmla_add_payment
и затем по нему получите все что требуется через get_post и get_post_meta
я честно не понимаю в чем проблема получить эти данные там где вам нужно
вы же решили сохранять их тут
tmla_insert_access( array( 'lessons_url' => $custom->lessons_url, 'lessons_title' => $custom->lessons_title, 'lessons_date_start' => $custom->lessons_date_start, 'lessons_start_time' => $custom->lessons_start_time, 'access_id' => $custom->access_id, 'user_id' => $payData->user_id, 'access_time' => $custom->access_time, ) );
если вам так удобно, то делайте так, просто эти данные можно получить для сохранения зная только ИД публикации, который вернется вам от платежки, а дальше, сохраняете эти данные куда вам надо и выводите там где хотите.

