Хранение данных в wp_posts и wp_postmeta
-
Доброго дня !
Подскажите, пожалуйста, как верно организовать хранение данных, получаемых из формы ввода пользователем, содержащей 6-8 полей ? (Соответственно каждая запись будет иметь 6-8 параметров)
Первоначально была мысль создавать собственную таблицу, но понимание множества уже имеющихся в WP средств и методов работы с таблицамиwp_posts
иwp_postmeta
подсказывает актуальность использования данных таблиц. Если предпочтительнее использовать таблицыwp_posts
иwp_postmeta
, то как верно организовать хранение данных: куда записывать данные 6-8 параметров — в поле post_content добавляемой записи таблицыwp_posts
? или же после отправки формы в поле post_content записывать основной параметр, а все остальные (второстепенные) параметры записывать в таблицуpostmeta
как метаданные после создания соответствующей записи в таблицеposts
?Наведите на верную мысль
Заранее благодарен за любую помощь
-
Например так
if (isset($_POST['form_1'])) { include( get_stylesheet_directory() . '/forms/form_1.php' ); }
Спасибо огромное ! Столкнулся с ещё одной трудностью
@yube , подскажите, пожалуйста, а как быть с промежуточными данными, которые пользователь не вводит в форму, а которые вычисляются через ajax-запрос в зависимости от его выбора ? (если вкратце: пользователь выбирает дату, на основе этой даты я лезу в базу и нахожу нужный коэффициент, в functions.php вывожу его черезecho "$index_build";
и записываю посредством ajax из custom.js в элемент формы span:function (response) {$span.text(response);}
Но как эту переменную передать в обработчик формы /forms/form_1.php ? при прямом обращении к $index_build из form_1.php естественно возникает ошибка, может есть какой-то другой вариант обращения к этой переменной? или нужно записывать её в <input type=»hidden»> и затем передавать в form_1.php ?
Как вариант
<form> <input type="hidden" name="foo">
jQuery(input[name=foo]).val(response);
Спасибо огромное, применяю данный вариант — всё работает
@yube , можно ещё вопрос по поводу хранения данных в таблицах posts и postmeta: если параметры передаваемые из формы хранить отдельно в postmeta, могу ли я выводить данные параметры также в полеpost_content
соответствующей записи таблицы posts ?@yube , извините ещё раз за беспокойство
Что я имел ввиду:
Вы не подскажете, можно ли из поляpost_content
обратиться к конкретному произвольному полю данной записи в таблице postmeta посредством функцииget_post_meta()
и вывести таким образом значение данного метаполя здесь же в полеpost_content
таблицы posts ?можно ли из поля post_content обратиться
Из поля никуда обратиться нельзя, потому что поле — данные. Обратиться можно только из программы.
вывести таким образом значение данного метаполя здесь же в поле post_content таблицы posts ?
В поле таблицы БД можно только хранить данные, но никак не выводить.
Это не придирки, это попытки расставить всё по своим местам. Когда расставится, тогда, отпадет много вопросов.
Например, отпадет вопрос «можно ли в шаблоне вместо
the_content()
написатьecho get_postmeta(the_ID(), 'meta_name', 1)
«. Отпадет потому, что очевидно же можно.@yube , спасибо большое за ответ, понял свою ошибку
Поясню свою идею:
я пытаюсь, чтобы поле post_content при выводе пользователю зависело от содержимого полей meta_value данного поста в таблицеpostmeta
;
Вопрос:
имеет ли право на жизнь реализация данной идеи посредством шорт-кодов ?
т.е. в поле post_content среди прочего текста будет прописано что-то вроде[post id=8 meta_1='meta_name' meta_2='meta_name_2']
где
id
— это id данной записи,
meta_n
— это некий meta_key записи.
В functions.php темы размещаю соответствующую функцию, которая будет извлекать все meta_value соответствующей записи из базы посредством
$meta = get_post_meta($id,$meta_n,true);
и подставлять их вместо шорт-кода при выводе поля post_content.
Вроде всё расставил. Имеет ли право на жизнь такая реализация ?и соответственно при изменении meta_value в таблице
postmeta
автоматом при посещении пользователем страницы с данной записью изменится при выводе её post_content. Верно я рассуждаю ?имеет ли право на жизнь реализация данной идеи посредством шорт-кодов ?
Имеет, конечно. Но я бы сделал не кучей, а по одному, типа
[meta key='foo']
. И если не планируется выводить «чужие» мета, то нет смысла передавать id. Впрочем, можно сделать его необязательным, с дефолтным = getID().при выводе поля post_content.
Есть одна тонкость. Вывод поля
$post->post_content
и результат работы функцииthe_content()
— две большие разницы. При выводе поля шорткоды так и останутся буковками в квадратных скобочках.@yube , спасибо
Как раз с id поста у меня заминка. «Чужие» мета выводить не планирую. Но как быть с id данного текущего поста ? Добавляется пост через фронт-энд пользователем после отправки формы:$post_data = array( 'post_title' => "$heat_name_object", 'post_content' => "<table class='table table-bordered'> <tr><td>Дата</td> <td>[post id=$post_id key='meta_name'</td></tr></table>", 'post_status' => 'publish' ); $post_id = wp_insert_post( wp_slash($post_data) ); update_post_meta( $post_id, 'meta_name', "$heat_region" );
т.е. на момент формирования $post_data ещё ведь неизвестно $post_id, его можно в принципе не указывать ? или пост сначала нужно добавить, а потом уже обновить и прописать в post_content данный шорт-код и в нем указать getID() ? Этот момент не понял (т.е. если не указать id, система возьмет текущий?)
<br>
ps Можно также вопрос, как в админке для постов отобразить блок «Произвольные поля»? Нужно писать код, или это делается средствами админки ? (не могу понять)его можно в принципе не указывать ?
Конечно. Главное, чтобы обработчик шорткода мог его получить, а для этого существует функция get_the_ID.
как в админке для постов отобразить блок «Произвольные поля»?
Справа вверху «настройки экрана» для классики или ⋮ → Настройки для блочного (гутенберга)
@yube , по поводу отображения в админке произвольных полей вы писали:
Справа вверху «настройки экрана» для классики
Но там нет ничего подобного: http://prntscr.com/sfuyop
Из учебника по WP:WordPress добавляет метаполе произвольных полей на экран редактирования записи по умолчанию, как показано здесь: http://prntscr.com/sfuznu
Если я открываю запись на редактирование (запись типа post, произвольные поля добавлены с помощью
update_post_meta()
) — произвольных полей нет, вижу следующее: http://prntscr.com/sfv27j
Подскажите, пожалуйста, что я делаю не так или что-то упустил и не сделал ?Но там нет ничего подобного:
Потому что это там совсем не там. Список записей и редактор записи — разные вещи.
Подскажите, пожалуйста, что я делаю не так или что-то упустил и не сделал ?
Ну я же написал
⋮ → Настройки
Вот картинка:
@yube , спасибо ещё раз
Подскажите ещё, пожалуйста, а если редактировать произвольные поля из фронт-энда ? в WP есть какая-то специальная функция подобно следующей для поста
edit_post_link("Изменить запись № $i",'','','','button special small');
?
Также наткнулся на вопрос касательно поля post_content_filtered таблицы posts — временный контент записи, нашел его объяснение:Там хранится временный контент… WordPress не использует это поле вообще, оно для плагинов. Оно устанавливается как пустое при каждом обновлении записи, кроме случаев, когда оно не указано. Т.е. если при обновлении записи это поле указано, оно будет записано, но если при другом обновлении оно не указано, оно сотрется.
Записал в post_content_filtered данные, потом изменил название поста, рубрику. Поле post_content_filtered не очистилось, оно теперь не очищается и в принципе его можно использовать для хранения неких данных ?
Откуда взяться «специальной функции», если в WP вообще нет фронт-эндного редактирования?
в принципе его можно использовать для хранения неких данных ?
Конечно можно. Но ровно до момента активации плагина, автор которого тоже подумал «зачем полю пропадать?» и использовал поле для своих целей.
- Тема «Хранение данных в wp_posts и wp_postmeta» закрыта для новых ответов.