22ответ(ов) в теме
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
1
21:36

В процессе вывода метаполей в форму публикации столкнулся со следующим:

У меня в админке в метабоксе есть мета-поля как чекбоксы.
Делал их как в примере тут

Вы не можете просматривать опубликованные ссылки

Вывожу в нужных местах на странице этим кодом:

if (get_post_meta($post->ID, 'my_meta_key', true) == checked) echo 'текст';

Всё отлично работает.
Затем настроил вывод этого чекбокса в форме публикации для произвольного типа записи.

И происходит следующее: если я в админке чекаю чекбокс, то вывод на странице поста происходит, но в форме публикации этого поста не обновляется чекбокс, он пустой.
И наоборот, если в лк в форме я чекаю чекбокс, то на странице поста выводится, а в админке обнуляется (причем этот meta_key удаляется из раздела "Произвольные поля", не просто пустой, а как будто нажали удалить, но при этом где-то сохраняется и выводится на странице) .
Meta_key там и там одинаковый.
Т.е. они как буд-то не стыкуются.
Может я добавил метабокс с чекбосами как-то заморочено.

С текстовыми полями аналогичная процедура работает правильно, а с чекбоксами такая вещь происходит.

Надеюсь на вашу помощь.

0
Вова (Otshelnik-Fm)
не в сети 4 дня
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18647
2
21:46

Распечатывали этот чекбокс? Как он выглядит когда вы в админке его задаете и когда задаете из фронтенда? Смотрите функцией var_dump

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

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

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
4
22:16

Otshelnik-Fm сказал(а)

Распечатывали этот чекбокс? Как он выглядит когда вы в админке его задаете и когда задаете из фронтенда? Смотрите функцией var_dump

Если я правильно вас понял, то вот , что получилось:

$a = get_post_meta($post->ID, 'my_meta_key', true);
var_dump($a);

Результат в обоих случаях одинаковый (когда прочекано только в админке и когда только во фронтенде):

array(1) { [0]=> string(4) "Да" } 

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
5
22:19

Андрей CS сказал(а)

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

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

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
6
22:23

Otshelnik-Fm сказал(а)

Распечатывали этот чекбокс? Как он выглядит когда вы в админке его задаете и когда задаете из фронтенда? Смотрите функцией var_dump

немного ошибся:
если нажата в админке, то результат такой: string(7) "checked"
если нажата только во фронтенде, то такой: array(1) { [0]=> string(4) "Да" }

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
7
12:55

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

Посмотрел файл плагина class-rcl-custom-fields.php
нашел там функцию rcl_get_custom_post_meta
и я не увидел там функцию update_post_meta, может просто не туда посмотрел.

Может тут нужно покапаться?

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
8
14:42

Вот так выглядит input у меня:

<input type="checkbox" id="xxx" name="xxx" <value="' . $xxx . '" ' . checked( $xxx, 'checked', false ) . '> ' . __( '', 'text_domain' );

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
9
19:04

Есть у кого-нибудь мысли по этому поводу?

0
Вова (Otshelnik-Fm)
не в сети 4 дня
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18647
10
19:08

Я в вашем вопросе потерялся, но если у вас разные данные:

если нажата в админке, то результат такой: string(7) "checked"
если нажата только во фронтенде, то такой: array(1) { [0]=> string(4) "Да" }

- то может стоит привести их к единому формату?

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
11
19:18

А формат чекбоксов в wp-recall я правильно смотрю? :
1. файл class-rcl-custom-fields.php ?
2. Функция get_type_checkbox
В ней код input для чекбокса:

<input '.$this->required.' '.$sl.' id="'.$this->slug.'_'.$a.'" type="checkbox" '.$class.' name="'.$this->slug.'[]" value="'.trim($chek[$a]).'">

Пробовал приводить к одному формату, но так и не получилось.
Как я понял правильнее формат в wp-recall привести к формату, который используется у меня, т.к. он простой и стандартный, на мой взгляд:

<input type="checkbox" id="xxx" name="xxx" <value="' . $xxx . '" ' . checked( $xxx, 'checked', false ) . '> ' . __( '', 'text_domain' );

Вам код wp-recall ближе, может подскажите какие правки необходимо внести в код?

0
Вова (Otshelnik-Fm)
не в сети 4 дня
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18647
12
19:33

Нельзя в плагине ничего менять! как вы не поймёте. Кто вам такие советы дает.
Вы сломаете его - а завтра создадите новую тему с проблемой что у вас в магазине что-то поломалась или в полях профиля или еще какие либо проблемы вылезут с виду не касающиеся того файла в котором вы меняете. Или вы крутой разработчик и уверены что нигде не заденете и не поломаете остальной функционал?

У вас есть свой метабокс - в нем и приводите к общему виду.

Что за порочная практика лезть внутрь плагина.

Вот смотрите тема -

Вы не можете просматривать опубликованные ссылки

человек все еще на 10 версией реколл сидит. А почему - да потому что так же как и вы ему надо было менять внутри плагина. Нельзя менять код плагина и вмешиваться в его работу.

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
13
19:45

То, что править не рекомендуется, это понятно.
Я хотя бы правильно функцию в плагине нашел - get_type_checkbox?

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
14
20:57

Вот как я создал метабокс с полем чекбокс, тестовый вариант - метабокс с одним чекбоксом:
(в примере нужно автозаменой заменить "dd" на свой ярлык произв. типа записи (кроме слов add) и можно вставить у себя и проверить то, о чем я писал, что чекбокс будет активен либо только в админке, либо только в форме в лк, но выводиться будут в любом месте на сайте при любом варианте):

class my_meta_box {
	public function __construct() {
		if ( is_admin() ) {
			add_action( 'load-post.php',     array( $this, 'init_metabox' ) );
			add_action( 'load-post-new.php', array( $this, 'init_metabox' ) );
		}
	}
	public function init_metabox() {
		add_action( 'add_meta_boxes', array( $this, 'add_metabox'  )        );
		add_action( 'save_post',      array( $this, 'save_metabox' ), 10, 2 );
	}
	public function add_metabox() {
		add_meta_box('dd_price', __( 'Новый метабокс', 'text_domain' ),	array( $this, 'render_metabox' ),'dd','advanced','default');
	}

	public function render_metabox( $post ) {

		wp_nonce_field( 'dd_nonce_action', 'dd_nonce' );

		$my_meta_key = get_post_meta( $post->ID, 'my_meta_key', true );

		if( empty( $my_meta_key ) ) $my_meta_key = '';

		echo '<table>';
		
		echo '	<tr>';
		echo '		<th><label for="my_meta_key">' . __( 'Заголовок с чекбоксом', 'text_domain' ) . '</label></th>';
		echo '		<td>';
		echo '			<input type="checkbox" id="my_meta_key" name="my_meta_key" <value="' . $my_meta_key . '" ' . checked( $my_meta_key, 'checked', false ) . '> ' . __( '', 'text_domain' );
		echo '		</td>';
		echo '	</tr>';
		
		echo '</table>';
	}

public function save_metabox( $post_id, $post ) {
		$nonce_name   = $_POST['dd_nonce'];
		$nonce_action = 'dd_nonce_action';

		if ( ! isset( $nonce_name ) )
			return;
		if ( ! wp_verify_nonce( $nonce_name, $nonce_action ) )
			return;
		if ( ! current_user_can( 'edit_post', $post_id ) )
			return;
		if ( wp_is_post_autosave( $post_id ) )
			return;
		if ( wp_is_post_revision( $post_id ) )
			return;
		// Sanitize user input.
$dd_new_my_meta_key = isset( $_POST[ 'my_meta_key' ] ) ? 'checked' : '';
update_post_meta( $post_id, 'my_meta_key', $dd_new_my_meta_key );
		}
}
new my_meta_box;

Теперь для проверки в форме публикации для этого типа записи нужно создать п/поле чекбокс с указанием этого meta_key - my_meta_key
И просто почекать в админке и посмотреть что произошло с чекбоксом в лк и, наоборот, в админке убрать и чекнуть в лк, сохранить и посмотреть чек в админке.
И в моем случае чек стоит или в админке или в лк, а мне хотелось бы, чтобы чек был и там и там.
Текстовое поле нормально передается из лк в админку и наоборот. С селектом тоже проблемы такие же.

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
15
21:04

что-то я совсем загрустил...

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
16
19:15

Посмотрел в базе данных в post_meta что происходит при проставлении чека там и там:
когда чек только в админке, то в базе у данного meta_key в колонке meta_value появляется checked.
Если чек только в ЛК, то вот такая запись: a:1:{i:0;s:0:"";}

Причем мета поля (согласно того метода добавления п/полей, который я указал выше) у меня добавляются в базу сразу с пустым значением по всем созданным произвольным полям в метабоксе.

И вот какой нюанс: когда в админке стоит чек, все нормально, все meta_key на месте, но когда я ставлю в ЛК, то все мета поля, которые до этого были в БД для типа чекбокс - удаляются и остается одно, которое я поставил в этот момент в ЛК с таким значением a:1:{i:0;s:0:"";}
Если я потом поставлю чекбокс в админке, то слетают чекбоксы из ЛК и возвращаются прежние.

Т.е. есть какое-то противоречие в методе сохранения мета-данных.

С чекбоксами для таксономий всё нормально.
Такое творится для чекбоксов пользовательских полей.
Пользовательские текстовые поля и селекты вроде корректно работают.

В коде wp-recall в файле class-rcl-custom-fields.php я, напрмер, не нашел функцию update_post_meta. Ее не должно быть там?

Еще в функции get_type_checkbox (файл class-rcl-custom-fields.php, строка 198)не хватает в коде для input этой части

' . checked( $xxx, 'checked', false ) . '

В селекте он есть и с ним все работает.

Может у кого будут какие-нибудь мысли?

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

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

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
18
12:26

Андрей CS сказал(а)

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

Ну у меня код довольно-таки стандартный и распространенный.
Я его взял с generatewp.com
Почему-то такое только с чекбоксом.

0
Вова (Otshelnik-Fm)
не в сети 4 дня
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18647
19
12:32

Вы взяли чужой код и утверждаете что он стандартный? Весело...

если нажата в админке, то результат такой: string(7) "checked"
если нажата только во фронтенде, то такой: array(1) { [0]=> string(4) "Да" }

- то может стоит привести их к единому формату?

0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
20
12:37

Понятно, что код чужой, но я же написал - он очень распространен.

- то может стоит привести их к единому формату?

Так я бы рад привести

Вы не можете просматривать опубликованные ссылки
0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
21
10:34

Обновлено

Вы не можете просматривать опубликованные ссылки
0
Dmk
не в сети 3 года
На сайте с 22.11.2016
Участник
Тем 52
Сообщения 217
22
14:37

Обновление

Вы не можете просматривать опубликованные ссылки
0
Тема закрыта. Публикация новых сообщений запрещена.