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

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

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

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

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

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

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

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

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

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

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

1
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
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
Сообщения 16855
6
21:23

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

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
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
Сообщения 16855
8
11:53

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

} else if(empty($access)){

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

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

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

1
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
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
Сообщения 16855
11
21:25

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

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
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
Сообщения 16855
13
09:29

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

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
14
11:56

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

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

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

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

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
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
Сообщения 16855
17
17:29

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

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
18
11:19

Доброго времени суток.
Возник еще вопрос по поводу добавления кастомных полей.
В таблице ДБ дополнения, я добавил 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>';

Суть проблемы в том, что при оплате через онлайн платеж.
Проходит с ошибкой, деньги списывает, но на сайте платеж не проходит и в ДБ не вносятся данные.


При оплате же с личного счета все работает отлично.
Может я не туда прописал?
За ранее благодарен!

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

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

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
20
18:25

Андрей CS сказал(а)
а ранее оплата через платежку нормально проходила? может просто настройки не верны?

Да, если не добавлять кастомные поля, то все работает отлично. Но это поля очень нужны.

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

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

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

кстати, в baggage_data уже передается post_id - идентификатор публикации на которой выведена форма оплаты, можно его использовать

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
23
10:49

Мне нужно, чтобы в функцию 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
)

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

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

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
25
11:41

Я правильно понял? В baggage_data передать например access_post_id => $post->ID (в доп поле в базе)?

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

если вы хотите передавать ИД текущей записи, т.е. той на которой выводится форма оплаты, то baggage_data уже должен содержать post_id, проверьте
ну или вы можете сами добавить как написали выше
не понял про доп. поле в базе, вы просто получите этот айдишник в ответе от платежки внутри функции tmla_add_payment
и затем по нему получите все что требуется через get_post и get_post_meta

0
Владимир
не в сети 1 день
На сайте с 29.11.2021
Участник
Тем 9
Сообщения 59
27
11:54

Да, я примерно понял. Но вот суть нужных мне полей, нужно чтобы выводить в ЛК как я описал выше и скрин приложил, в tmla_tab не приходит $post_id/

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

я честно не понимаю в чем проблема получить эти данные там где вам нужно
вы же решили сохранять их тут

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

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

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