Доброго времени суток.
Возникла такая потребность, чтобы после оплаты форма была ни кому не доступно.
То есть только 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, ) );
если вам так удобно, то делайте так, просто эти данные можно получить для сохранения зная только ИД публикации, который вернется вам от платежки, а дальше, сохраняете эти данные куда вам надо и выводите там где хотите.