Домой Wp-Recall WP-Recall: Вопросы и ответы Вопросы по дополнению Time Limit Access
17ответ(ов) в теме
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
1
19:04
Версия WP-Recall: 16.26.1

Доброго времени суток.
Возникла такая потребность, чтобы после оплаты форма была ни кому не доступно.
То есть только 1 пользователь может приобрести доступ. Единоразовая возможность оплаты.
Может уже кто то задавался подобным вопросом и есть какое то решение?
За ранее благодарен.

0
Андрей CS
не в сети 9 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16273
2
19:38

Добрый день, если только добавлять какой то флаг в метаданные публикации об оплате, а потом проверять его при выводе кнопке на оплату, если стоит, то не выводим. Хотя можно и запрос на оплату доступа в историю оплат сделать.

0
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
3
19:44

Андрей CS сказал(а)
Хотя можно и запрос на оплату доступа в историю оплат сделать.

А можно об этом поподробнее?

0
Андрей CS
не в сети 9 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16273
4
20:01

можете так получить активный действующий доступ на определенный доступ

$access = tmla_get_access( array(
		'access_id'		 => $access_id,
		'access_status'	 => 1
		) );

если $access не пустой, значит кто то его уже приобрел и в данный момент он действует

1
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
5
21:13

Я вот пробовал так выводить, $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
        )

)

0
Андрей CS
не в сети 9 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16273
6
21:23

вместо $access_id в том коде что я привел укажите нужный вам доступ, например 'post-121'

0
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
7
10:25

Сломал всю голову, и ничего что то не выходит. Вместо $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
        )
)

Вот не совсем понимаю, как нужно составить запрос, чтобы единоразово было доступно поле оплаты.

0
Андрей CS
не в сети 9 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16273
8
11:53

я ничего странного в результатах не вижу, вам приходят два действующих доступа на текущую публикацию потому что его уже успели приобрести, если вы перестанете предлагать возможность приобретать доступ к публикации если он уже был приобретен, то в массиве будет приходить только одно значение
меняете ваш код так

} else if(empty($access)){

и получаете желаемое - форма на оплату будет выводится только в случае, если действующего доступа к публикации ни у кого больше нет

1
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
9
12:13

Огромное Спасибо. Вот я чего то совсем не догадался в в else дополнить не много запрос. Я на оборот все усложнял.
Я не много дополнение еще модифицировал, добавил поле в базу, куда записывает заголовок поста, в шорткод передаю заголовок, и в место ID доступа я вставляю ссылку на пост. И теперь в ЛК и в Админке можно перейти на оплаченный контент.

1
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
10
18:38

Появился новый вопрос.
В ЛК где выводятся публикации в шаблоне 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() передается мало аргументов. Но мне не нужно что либо выводить кроме проверки статуса.
Может я не в том направлении смотрю?

0
Андрей CS
не в сети 9 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16273
11
21:25

не совсем понял на что именно ругается, что значит мало аргументов?

0
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
12
22:16

Вот что выводит:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function tmla_is_have(), 2 passed in

0
Андрей CS
не в сети 9 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16273
13
09:29

Функция принимает два аргумента, убедитесь, что это так

0
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
14
11:56

Да, guid и status Я пытаюсь получить.

0
Андрей CS
не в сети 9 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16273
15
12:54

Ну вам ошибка говорит, что это не так, убедитесь, что данные которые вы передаете не пусты и соответствуют тому, что вы ожидаете.
guid - это вроде ссылка на пост, зачем ее использовать?
у вас кстати есть глобальный объект $TML_User_Access, он содержит данные по доступа текущего пользователя, необязательно на каждый пост делать запрос к БД и тащить оттуда эти данные.
Этот объект содержит в себе такие же данные как если бы вы сделали запрос на получение всех активных доступов текущего пользователя

tmla_get_access( array(
		'user_id'       => $user_ID,
		'access_status' => 1,
		'number'        => - 1
	) );

0
Владимир DestWeb
не в сети 8 часов
На сайте с 29.11.2021
Участник
Тем 3
Сообщения 21
16
15:08

Сделал все вроде правильно, но не выводится отрицательное значение.
Выводит только оплачено на все посты.

$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
		));

0
Андрей CS
не в сети 9 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16273
17
17:29

у вас в переменной $isBuy не булев значение, а массив из всех доступов текущего пользователя, вам нужно прогнать этот массив через цикл и проверить есть ли там нужный вам доступ, а далее вернуть результат совпадения false/true

0
Вы не имеете права на публикацию сообщений в этой теме