В процессе вывода метаполей в форму публикации столкнулся со следующим:
У меня в админке в метабоксе есть мета-поля как чекбоксы.
Делал их как в примере тут
Вывожу в нужных местах на странице этим кодом:
if (get_post_meta($post->ID, 'my_meta_key', true) == checked) echo 'текст';
Всё отлично работает.
Затем настроил вывод этого чекбокса в форме публикации для произвольного типа записи.
И происходит следующее: если я в админке чекаю чекбокс, то вывод на странице поста происходит, но в форме публикации этого поста не обновляется чекбокс, он пустой.
И наоборот, если в лк в форме я чекаю чекбокс, то на странице поста выводится, а в админке обнуляется (причем этот meta_key удаляется из раздела "Произвольные поля", не просто пустой, а как будто нажали удалить, но при этом где-то сохраняется и выводится на странице) .
Meta_key там и там одинаковый.
Т.е. они как буд-то не стыкуются.
Может я добавил метабокс с чекбосами как-то заморочено.
С текстовыми полями аналогичная процедура работает правильно, а с чекбоксами такая вещь происходит.
Надеюсь на вашу помощь.
Otshelnik-Fm сказал(а)
Распечатывали этот чекбокс? Как он выглядит когда вы в админке его задаете и когда задаете из фронтенда? Смотрите функцией var_dump
Если я правильно вас понял, то вот , что получилось:
$a = get_post_meta($post->ID, 'my_meta_key', true); var_dump($a);
Результат в обоих случаях одинаковый (когда прочекано только в админке и когда только во фронтенде):
array(1) { [0]=> string(4) "Да" }
Андрей CS сказал(а)
удаляйте свой код и делайте все через произвольные поля формы публикации, не надо велосипед изобретать.
Поля были сделаны до внедрения данного плагина, поэтому по максиму ищу точки соприкосновения, чтобы изменений по минимуму.
И с текстовыми полями всё хорошо работает, всё сопоставлется и обновляется, а с чекбоксами не совсем.
Otshelnik-Fm сказал(а)
Распечатывали этот чекбокс? Как он выглядит когда вы в админке его задаете и когда задаете из фронтенда? Смотрите функцией var_dump
немного ошибся:
если нажата в админке, то результат такой: string(7) "checked"
если нажата только во фронтенде, то такой: array(1) { [0]=> string(4) "Да" }
Мне кажется, что не происходит обновления мета-данных при сохранении из админки или из лк.
Запись идет сразу в базу, поэтому выводится отмеченный чекбокс на странице поста.
Посмотрел файл плагина class-rcl-custom-fields.php
нашел там функцию rcl_get_custom_post_meta
и я не увидел там функцию update_post_meta, может просто не туда посмотрел.
Может тут нужно покапаться?
А формат чекбоксов в 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 ближе, может подскажите какие правки необходимо внести в код?
Нельзя в плагине ничего менять! как вы не поймёте. Кто вам такие советы дает.
Вы сломаете его - а завтра создадите новую тему с проблемой что у вас в магазине что-то поломалась или в полях профиля или еще какие либо проблемы вылезут с виду не касающиеся того файла в котором вы меняете. Или вы крутой разработчик и уверены что нигде не заденете и не поломаете остальной функционал?
У вас есть свой метабокс - в нем и приводите к общему виду.
Что за порочная практика лезть внутрь плагина.
Вот смотрите тема -
человек все еще на 10 версией реколл сидит. А почему - да потому что так же как и вы ему надо было менять внутри плагина. Нельзя менять код плагина и вмешиваться в его работу.
Вот как я создал метабокс с полем чекбокс, тестовый вариант - метабокс с одним чекбоксом:
(в примере нужно автозаменой заменить "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
И просто почекать в админке и посмотреть что произошло с чекбоксом в лк и, наоборот, в админке убрать и чекнуть в лк, сохранить и посмотреть чек в админке.
И в моем случае чек стоит или в админке или в лк, а мне хотелось бы, чтобы чек был и там и там.
Текстовое поле нормально передается из лк в админку и наоборот. С селектом тоже проблемы такие же.
Посмотрел в базе данных в 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 ) . '
В селекте он есть и с ним все работает.
Может у кого будут какие-нибудь мысли?