Поддержка → Проблемы и решения → Хранение данных в wp_posts и wp_postmeta
Хранение данных в 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 , в очередной раз благодарю Вас. Подскажите ещё, пожалуйста, в параметрах шорт-кода можно ведь указывать множественные значения, т.е.
[result_tab category=’heat’ area_type=‘area_1, area_2, area_3’] ?
Тогда код примет вид:$c = shortcode_atts( array( 'category' => '', 'area_type' => array() ), $atts); extract($c);
Верно или все же я допустил ошибку ?
@yube , извините ещё раз, мне уже становится стыдно… можно ещё вашего совета: шорт-код, про множественные значения которого я задавал вопрос выше, стал очень большим (около 2000 строк) — и в результате functions.php моей темы вырос до 3000 строк. Это очень большой размер для functions.php ? и можно ли данный шорт-код, который будет использоваться редко, оформить в виде отдельного плагина, в котором и будет только этот огромный шорт-код ?
ps ещё раз извините за беспокойстводо 3000 строк
Не так уж и много.
и можно ли данный шорт-код, который будет использоваться редко, оформить в виде отдельного плагина
Конечно.
@yube , извините ещё раз за беспокойство, по поводу вывода информации в файлы *.csv Вы писали ранее:
Да почти так же, как и для вывода в html. Только с заголовками
header("Content-type: text/csv; charset=UTF-8"); header("Content-Disposition: attachment; filename=export.csv");
Я формирую файл с помощью fputcsv() с сепаратором
;
, но на выходе браузер отдает мне файл с исходным кодом текущей страницы. Вот мой код:if (isset($_POST['export_send'])) { $fn = 'export.csv'; $file = get_stylesheet_directory() . "/$fn"; $handle = fopen("$file", "w"); fputs($handle, chr(0xEF) . chr(0xBB) . chr(0xBF)); // BOM fputcsv($handle, array('Test', 'Столбец', 'Данные'), ';'); fclose($handle); header('Content-type: text/csv; charset=UTF-8'); header('Content-Disposition: attachment; filename="'.$file.'"'); }
Данный код я прописал в header.php, в итоге файл export.csv создается в папке темы и в него записывается то, что я указал, но браузер отдает вот это: http://prntscr.com/sqpu0p. Всё перепробовал, подскажите, пожалуйста, где я допустил ошибку ? как мне в заголовке указать на данный файл из папки темы ?
но на выходе браузер отдает мне файл с исходным кодом текущей страницы.
Что написали, то и отдает :/
Нет смысла создавать физический файл, можно (если файл не нужно раздавать сотням юзеров в секунду) сразу в поток. Сначала заголовки, затем BOM, затем строки и die(). Всё.if (isset($_POST['export_send'])) { header('Content-type: text/csv; charset=UTF-8'); header('Content-Disposition: attachment; filename=export.csv'); $out = fopen('php://output', 'w'); fputs($out, chr(0xEF) . chr(0xBB) . chr(0xBF)); fputcsv($out, array('Test', 'Столбец', 'Данные'), ';'); fclose($out); die(); }
@yube , спасибо огромное, очень помог Ваш совет. Остался вопрос, подскажите пожалуйста: данные для экспорта из базы я выбираю по одной метке и по одной категории, а если категорий или меток несколько, нужно перечислять их в коде через запятую ? вот так:
$query = new WP_Query( array( 'post_type' => 'post', 'post_status' => 'private', 'posts_per_page' => -1, 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $export_type_1, $export_type_2 ), array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => $export_period_1, $export_period_2 ), ), ) );
Так верно ?
нужно перечислять их в коде через запятую ?
Думаю, лучше массивом
'terms' => array($export_type_1, $export_type_2),
как в примерах
https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters@yube , ещё раз спасибо
Подскажите ещё, пожалуйста, столкнулся с такой проблемой: при экспорте данных в файлы *.csv при помощи
fputcsv($out, array('Количество:', "$number"), ';');
если $number=2.21 (к примеру), то текстовый редактор воспринимает это нормально как 2.21, а при просмотре в Excel отображается февраль 2021. Это можно как-то исправить? может формат переменной нужно преобразовать?
и нормально ли, что я код, который формирует поток (заголовки, затем BOM, затем строки и die()), поместил в самое начало header.php до, как вы и писали, самого первого байта контента ?при просмотре в Excel отображается февраль 2021
«Ну, сумасшедший, что возьмешь» 🙂
Это можно как-то исправить?
Вроде как у него есть расширенные настройки импорта, но я их не видел. Я вообще Экселя уже полтора десятка лет не видел, и не скучаю. Так что, увы, тут ничем помочь не могу.
и нормально ли
Лучше бы, конечно, на какой-то хук в functions.php темы или в плагин. Но раз работает и не мешает другим, можно считать что нормально.
@yube , спасибо за ответ
Лучше бы, конечно, на какой-то хук в functions.php темы или в плагин
А если все же вешать экспорт данных на какой либо хук, не подскажете, какие хуки срабатывают в момент экспорта при помощи
fputcsv()
?какие хуки срабатывают в момент экспорта при помощи fputcsv() ?
Более чем странный вопрос. Сама fputcsv(), естественно, никакие хуки не активирует, потому что она не вордпрессовская и про API wordpress вообще ничего не знает. А вокруг нее — это зависит от того, что напишете. Можете даже своих хуков добавить 🙂
@yube , ещё раз огромное спасибо, хранение данных и экспорт наладил. Можно ещё вопрос: подскажите, пожалуйста, каким образом лучше реализовать во фронт-энде вывод записей пользователей для админа системы с возможностью просмотра записей по определенной группе пользователей (на группы делю по полям таблицы usermeta) или по категории записи подобно скрину http://prntscr.com/swof6b, где заголовок это ссылка на саму запись ?
Наведите на верную мысль, пожалуйста@yube , позвольте задать еще один вопрос: никак не могу разобраться как формировать адрес ссылки в меню в зависимости от того авторизован пользователь или нет. Помогите, пожалуйста, если будет возможность.
Тему свою реализовал на основе стартовой темы clean-wp-template. Не могу понять как формируется меню, чтобы в нужном месте откорректировать код и сформировать ссылку в меню в зависимости от того авторизован пользователь или нетis_user_logged_in()
. Вот мое меню http://prntscr.com/t235gr, и вот функция из functions.php, формирующая меню:if (!class_exists('bootstrap_menu')) { class bootstrap_menu extends Walker_Nav_Menu { private $open_submenu_on_hover; function __construct($open_submenu_on_hover = true) { $this->open_submenu_on_hover = $open_submenu_on_hover; } function start_lvl(&$output, $depth = 0, $args = array()) { $output .= "\n<ul class=\"dropdown-menu\">\n"; } function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) { $item_html = ''; parent::start_el($item_html, $item, $depth, $args); if ( $item->is_dropdown && $depth === 0 ) { if (!$this->open_submenu_on_hover) $item_html = str_replace('<a', '<a class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"', $item_html); $item_html = str_replace('</a>', ' <b class="caret"></b></a>', $item_html); } $output .= $item_html; } function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) { if ( $element->current ) $element->classes[] = 'active'; $element->is_dropdown = !empty( $children_elements[$element->ID] ); if ( $element->is_dropdown ) { if ( $depth === 0 ) { $element->classes[] = 'dropdown'; if ($this->open_submenu_on_hover) $element->classes[] = 'show-on-hover'; } elseif ( $depth === 1 ) { $element->classes[] = 'dropdown-submenu'; } } parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output); } } }
Помогите, пожалуйста, разобраться, если будет возможность.
как формировать адрес ссылки в меню в зависимости от того авторизован пользователь или нет.
- Тема «Хранение данных в wp_posts и wp_postmeta» закрыта для новых ответов.