Поддержка Проблемы и решения Хранение данных в wp_posts и wp_postmeta

Просмотр 15 ответов — с 31 по 45 (всего 145)
  • @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 сохранится, верно ?

    Модератор Юрий

    (@yube)

    но ведь моя «конструкция» ниже позволяет редактировать 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 в этот же момент вносится некая информация — даже используя приведённый мной фильтр выше всё равно некий плагин сможет переписать данное поле ?
    или несмотря на любые фильтры это поле всё же лучше не использовать для хранения данных (пусть даже и промежуточных, но которые всё равно могут когда-нибудь пригодиться) ?

    Модератор Юрий

    (@yube)

    даже используя приведённый мной фильтр

    А что фильтр? Во вселенной 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() ?

    Модератор Юрий

    (@yube)

    Подскажите, пожалуйста, а как сделать 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()
    наверное я скорее чего-то не до понимаю ?

    Модератор Юрий

    (@yube)

    Но параметр key (имя мета-поля в шорт-коде [meta key=’name’]) всегда будет в шорт-коде

    Проверки никогда не бывают лишними. Ибо

    Всё, что может пойти не так, пойдёт не так.
    (Закон Мерфи)

    т.к. $post_id получим в любом случае из get_the_ID()

    И тоже, строго говоря, не факт. Хотя вероятность такого исключения значительно ниже, чем $key == ''.

    @yube , т.е. если в шорт-коде явно будет указано post_id=N, то атрибут
    'post_id' => get_the_ID()
    не будет вычисляться с помощью функции get_the_ID(), а будет браться тот, что явно указан ? это так работает ?

    Модератор Юрий

    (@yube)

    Да.
    Функция shortcode_atts выполняет две задачи:
    — выбрасывает атрибуты, не перечисленные в парах;
    — подставляет дефолтное значение, если соотв. атрибут в шорткоде не задан.
    https://developer.wordpress.org/reference/functions/shortcode_atts/

    @yube , спасибо, с shortcode_atts() разобрался.
    Вопрос по функции extract(), я так понимаю она принимает ключи массива, устанавливает их как имена переменных и их значения как значения переменных. Но про неё написано:

    Предупреждение! Не используйте extract () для ненадежных данных, таких как пользовательский ввод. Это небезопасно, и вы можете сделать много конфликтов, а также перезаписать некоторые коды, которые у вас были раньше. Это может быть использовано только в какой-то действительно защищенной части кода, где вы будете знать, что ожидается и что вам нужно.

    и

    Не используйте extract(). Это очень плохой стиль кода. Его использование устарело даже в ядре

    Мне действительно не стоит использовать данную функцию? Но как тогда задать имена и значения переменных ?

    Модератор Юрий

    (@yube)

    А вот это уже ни разу не 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 в конце, цикл ведь и так возвращает данные, запутался…Подскажите, пожалуйста

    Модератор Юрий

    (@yube)

    До цикла $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.

    • Ответ изменён 2 года, 1 месяц назад пользователем Юрий.
    Модератор Юрий

    (@yube)

    цикл ведь и так возвращает данные

    Цикл сам по себе никому ничего не возвращает и ничего не выводит. Он просто выполняется.

Просмотр 15 ответов — с 31 по 45 (всего 145)
  • Тема «Хранение данных в wp_posts и wp_postmeta» закрыта для новых ответов.