Хранение данных в 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
?Наведите на верную мысль
Заранее благодарен за любую помощь
-
@yube , но ведь моя «конструкция» ниже позволяет редактировать post_title и post_content из фронт-энда:
the_title('<header><h2>','</h2></header>'); the_content(); edit_post_link("Изменить запись № $i",'','','','button special small');
Вот я и подумал, что может быть имеются схожие алгоритмы и для метаданных записи ?
<br>
По поводу использования post_content_filtered вы писали:Конечно можно. Но ровно до момента активации плагина, автор которого тоже подумал «зачем полю пропадать?»
А если в functions.php использовать фильтр, приведённый здесь. Тогда ведь независимо от каких-либо плагинов поле post_content_filtered сохранится, верно ?
но ведь моя «конструкция» ниже позволяет редактировать post_title и post_content из фронт-энда:
Каким это образом? Функция edit_post_link всего лишь выводит ссылку на /wp-admin/post.php?action=edit&post=ID_записи. Это админка. Где тут фронт-энд?
Тогда ведь независимо от каких-либо плагинов поле post_content_filtered сохранится, верно ?
Я о том, что какой-нибудь плагин может записать в это поле свою информацию, затерев Вашу. Или Вы затрете информацию, записанную плагином. Что так, что этак, а нормальная работа сайта будет нарушена.
@yube , благодарю вас
Разобрался — действительноedit_post_link ()
всего лишь выводит ссылку в админку, но впрочем там уже и можно изменить все произвольные поля записи, опять-таки да — это админка, доступ к которой получен из лицевой стороны сайта, не фронт-энд, спасибо за пояснение.
По поводу post_content_filtered вы писали:Я о том, что какой-нибудь плагин может записать в это поле свою информацию, затерев Вашу.
Даже если запись добавляется из фронт-энда пользователем и в поле post_content_filtered в этот же момент вносится некая информация — даже используя приведённый мной фильтр выше всё равно некий плагин сможет переписать данное поле ?
или несмотря на любые фильтры это поле всё же лучше не использовать для хранения данных (пусть даже и промежуточных, но которые всё равно могут когда-нибудь пригодиться) ?даже используя приведённый мной фильтр
А что фильтр? Во вселенной wordpress нет механизма, позволяющего зарезервировать и монопольно использовать какие-либо поля записей в БД или свойства объектов, не объявленные как privatе.
это поле всё же лучше не использовать для хранения данных
У нас в школьных мастерских висел плакат
Используй только исправный инструмент и строго по назначению.Для хранения метаданных существует соответствующий механизм. Вероятнее всего, использование поля прямо в таблице posts даст некий выигрыш в производительности при чтении, но, во-первых, зачем рисковать и, во-вторых, зачем лишать себя возможности использования всех штатных механизмов, доступных для postmeta? Не вижу смысла. Вряд ли Вы построите сайт, где небольшой выигрыш в производительности будет критичным.
Спасибо, так и сделал
@yube , по поводу шорт-кодов вы писали:я бы сделал не кучей, а по одному, типа [meta key=’foo’]. И если не планируется выводить «чужие» мета, то нет смысла передавать id. Впрочем, можно сделать его необязательным, с дефолтным = getID().
Шорт-код типа
[meta key='name']
реализовал в functions.php так:function meta_content($atts) { extract(shortcode_atts(array('key'=>""),$atts)); $post_id = get_the_ID(); $meta = get_post_meta($post_id,$key,true); return "$meta"; } add_shortcode('meta','meta_content');
Подскажите, пожалуйста, а как сделать id поста необязательным, как вы написали с дефолтным = getID() ?
Подскажите, пожалуйста, а как сделать id поста необязательным, как вы написали с дефолтным = getID() ?
function meta_content($atts) { $a = shortcode_atts( array( 'key' => '', 'post_id' => get_the_ID(), ), $atts ); extract($a); if ( $key == '' ) return ''; $meta = get_post_meta($post_id, $key, true); return $meta;
Будет в шорткоде явно указано post_id=N, будет использовано N. Если нет, то будет использоваться ID текущего.
@yube , вопрос по 7-ой строке кода:
if ( $key == '' ) return '';
Но параметр key (имя мета-поля в шорт-коде [meta key=’name’]) всегда будет в шорт-коде, а id может быть не указан, значит верно
if ( $post_id == '' ) return '';
но и это наверное не верно т.к. $post_id получим в любом случае из get_the_ID()
наверное я скорее чего-то не до понимаю ?Но параметр key (имя мета-поля в шорт-коде [meta key=’name’]) всегда будет в шорт-коде
Проверки никогда не бывают лишними. Ибо
Всё, что может пойти не так, пойдёт не так.
(Закон Мерфи)т.к. $post_id получим в любом случае из get_the_ID()
И тоже, строго говоря, не факт. Хотя вероятность такого исключения значительно ниже, чем
$key == ''
.@yube , т.е. если в шорт-коде явно будет указано post_id=N, то атрибут
'post_id' => get_the_ID()
не будет вычисляться с помощью функции get_the_ID(), а будет браться тот, что явно указан ? это так работает ?Да.
Функция shortcode_atts выполняет две задачи:
— выбрасывает атрибуты, не перечисленные в парах;
— подставляет дефолтное значение, если соотв. атрибут в шорткоде не задан.@yube , спасибо, с shortcode_atts() разобрался.
Вопрос по функцииextract()
, я так понимаю она принимает ключи массива, устанавливает их как имена переменных и их значения как значения переменных. Но про неё написано:Предупреждение! Не используйте extract () для ненадежных данных, таких как пользовательский ввод. Это небезопасно, и вы можете сделать много конфликтов, а также перезаписать некоторые коды, которые у вас были раньше. Это может быть использовано только в какой-то действительно защищенной части кода, где вы будете знать, что ожидается и что вам нужно.
и
Не используйте extract(). Это очень плохой стиль кода. Его использование устарело даже в ядре
Мне действительно не стоит использовать данную функцию? Но как тогда задать имена и значения переменных ?
А вот это уже ни разу не wordpress. extract он и в битриксе extract.
Но ладно. Во-первых, shortcode_atts фильтрует
базарпеременные, так что лишние не пролезут. Во-вторых, дальше функции-обработчика шорткода созданные экстрактом переменные не вылезут, а поскольку он микроскопический (в данном случае), то всё на виду и под контролем.Можно обращаться непосредственно к элементам массива $a[‘post_id’] и $a[‘key’]. Я часто так и делаю, но не от страха перед exctract, а от лени. Можно даже использовать входной $atts, а проверку на значение и установку дефолтного делать «вручную» (сюрприз! это Вам домашнее задание по основам php). Порой так даже читабельнее получается.
@yube , спасибо, с этим разобрался
можно ещё вопрос касательно шорт-кодов: в примере выше в шорт-коде я возвращаю отдельную переменную
return $meta;
А как быть, если мне нужно вернуть данные полученные из произвольного цикла (некоторые поля из таблиц posts и postmeta, выбрав по текущему авторизованному пользователю и по некоторой определенной рубрике) ? Немного переделал функцию шорт-кода:function info_content($atts) { $a = shortcode_atts( array( 'author' => '', 'category' => '' ), $atts ); extract($a); if ( $author == '' || $category == '') return ''; $myPosts = new WP_Query('cat=' . $category. '&author=' .$author ); while ( $myPosts->have_posts() ) : $myPosts->the_post(); ?> <!-- как извлечь и вывести поле post_title, post_excerpt и мета-поля текущей записи и показать в месте вызова шорт-кода --> <?php endwhile; ?>
Извините в очередной раз за беспокойство. После строчки кода
$myPosts->the_post();
не могу понять как извлечь и вывести поле post_title, post_excerpt и мета-поля для каждой выбранной записи ?
как извлечь мета-поля — ведь get_post_meta() требует указания ID, а мне его не нужно указывать в данном случае в цикле,
и нужно ли прописывать операторreturn
в конце, цикл ведь и так возвращает данные, запутался…Подскажите, пожалуйстаДо цикла
$return = '';
В цикле$return .= $myPosts->get_the_title(); $return .= $myPosts->get_the_excerpt(); и т.д.
и
return $return;
в конце функции.Либо использовать перехват вывода (https://www.php.net/manual/ru/ref.outcontrol.php) и echo/print внутри Цикла.
p.s. Могу ошибаться по первой части. Башка совсем не варить. Их бин больной. Sorry.
- Ответ изменён 4 года, 6 месяцев назад пользователем Юрій.
цикл ведь и так возвращает данные
Цикл сам по себе никому ничего не возвращает и ничего не выводит. Он просто выполняется.
- Тема «Хранение данных в wp_posts и wp_postmeta» закрыта для новых ответов.