Поддержка Проблемы и решения Кастомные поля и кеширование

  • Создано два кастомных типа контента — product и recomend.
    Первый имеет три десятка кастомных полей + пяток таксономий.
    Во втором сделано кастомное поле с выбором постов из первого. Нечто вроде «похожих записей», коих будет выбираться до сотни для одной записи типа recomend. https://i.imgur.com/WLkLrxn.jpg
    И соответственно выводится в виде карточек с кастомными полями productа. (но не всё три десятка, а около десятка)

    Как мне кажется это должно создавать большую нагрузку на базу и память.

    Подскажите, надо ли и как правильно делать кеширование для таких случаев? Имею ввиду не использование плагинов, а программно, на уровне ВП. Что почитать, в какую сторону смотреть? Желательно на русском.
    Подозреваю, что надо использовать Redis или Memcached, но и в этом случае вопросы те же.

    Читал про объектное и транзитные кеширования в ВП, но мои знания об этом поверхностны и не знаю какое нужно для данного случая.

    Или я ошибаюсь и ВП уже такое сам кеширует и от этого нагрузка не будет существенной?

Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Подскажите, надо ли и как правильно делать кеширование для таких случаев? Имею ввиду не использование плагинов, а программно, на уровне ВП.

    На уровне ВП используются плагины. У стандартного ВП никакого кэширования нет.

    надо использовать Redis или Memcached,

    Никакого отношения к ВП не имеет. Это уровень сервера.

    У стандартного ВП никакого кэширования нет.

    То, что Вы об этом не знаете — не значит что этого нет.

    Никакого отношения к ВП не имеет. Это уровень сервера.

    php, mysql, gd и прочее тоже «уровень сервера». И ВП со всем этим работает.

    Пожалуйста, не «помогайте» мне никогда.

    Модератор Yui

    (@fierevere)

    ゆい

    Создано два кастомных типа контента

    Чем создано?
    Плагин или самописно?

    Чем создано?
    Плагин или самописно?

    Кастомные типы — самописно.
    Кастомные поля с https://wordpress.org/plugins/meta-box/ и его генератором https://metabox.io/online-generator/

    То, что Вы об этом не знаете — не значит что этого нет.

    Ну так просветите — вы же знаете

    php, mysql, gd и прочее тоже «уровень сервера». И ВП со всем этим работает.

    Ровно в той же степени, как с этим работает Джумла, да и простой html.
    Повторю еще раз: не путайте теплое с мягким — к ВП это никакого отношения не имеет.

    Ну так просветите — вы же знаете

    https://wpmag.ru/2013/keshirovaniye-wordpress/ и ещё несколько постов там же.

    Повторю еще раз: не путайте теплое с мягким — к ВП это никакого отношения не имеет.

    Повторю еще раз: лично Вы, пожалуйста, не «помогайте» мне никогда.

    и ещё несколько постов там же.

    В самом ядре WordPress кэширование страниц не реализовано, но есть все необходимые функции для реализации этого на уровне плагинов.
    Я так понимаю вы либо это все не читали, либо у вас проблемы с пониманием

    Повторю еще раз: лично Вы, пожалуйста, не «помогайте» мне никогда.

    Я тут посовещался и общим собранием постановили: отклонить вашу просьбу.

    Модератор Yui

    (@fierevere)

    ゆい

    господа, хватит кусаться.

    ———

    meta-box использует кеш объектов:

    inc/fields/user.php:            wp_cache_set( 'last_changed', microtime(), 'users' );
    inc/fields/user.php:            wp_cache_set( $cache_key, $options, 'meta-box-user-field' );
    inc/fields/post.php:            wp_cache_set( $cache_key, $options, 'meta-box-post-field' );
    inc/fields/user.php:            $last_changed = wp_cache_get_last_changed( 'users' );
    inc/fields/user.php:            $options      = wp_cache_get( $cache_key, 'meta-box-user-field' );
    inc/fields/post.php:            $last_changed = wp_cache_get_last_changed( 'posts' );
    inc/fields/post.php:            $options      = wp_cache_get( $cache_key, 'meta-box-post-field' );
    

    см (для оптимизации своего самописного кода, если нужно):

    https://developer.wordpress.org/reference/functions/wp_cache_set/
    https://developer.wordpress.org/reference/functions/wp_cache_get/

    Функции объектного кеша будут работать всегда
    в худшем случае они будут использовать таблицу wp_options в SQL
    хотя конечно по возможности лучше установить redis или memcached
    Требуется (для редис):
    1. Запущенное на сервере ПО redis-server
    2. Расширение PHP (pecl) redis
    3. Плагин https://ru.wordpress.org/plugins/redis-cache/

    аналогично для memcached.

    Модератор Yui

    (@fierevere)

    ゆい

    Также можно использовать транзиентные объекты
    (они аналогично используют кеширование в redis/memcached при их наличии, и wp_options если ничего нет)

    https://developer.wordpress.org/reference/functions/set_transient/
    https://developer.wordpress.org/reference/functions/get_transient/

    • Ответ изменён 6 месяцев, 2 недели назад пользователем Yui.

    Я так понимаю вы либо это все не читали, либо у вас проблемы с пониманием

    Конечно же у меня, господин читатель 🙂

    В ядре существует три основных вида кэширования — кэширование страниц, кэширование объектов и транзитное кэширование.

    Судя по всему Вы не только не отличаете виды кеширования, но даже ни про директиву конфига WP_CACHE не знаете, ни про функции wp_cache_*. Учите матчасть, внимательный читатель. 🙂

    Yui, спасибо. Про наличие функций знаю, а вот как ими пользоваться скорее нет, чем да. Не приходилось пока ещё.

    Модератор Yui

    (@fierevere)

    ゆい

    https://wpmag.ru/2015/transient-cache-wordpress/
    тут достаточно приличные примеры кода

    ни про директиву конфига WP_CACHE не знаете, ни про функции wp_cache_*.

    Зачем мне это знать, когда про это знают плагинописатели?
    Я не любитель велосипедостроительства с костылями на квадратных колесах и не являюсь членом секты «бесплагинофф»

    Модератор Yui

    (@fierevere)

    ゆい

    ну почему же, по мелочи всегда можно написать какой-нибудь код и закешировать, если логика использования данных это позволяет.

         $top_posts = get_transient( 'trans_evo_topposts' );
            if (!$top_posts) { $top_posts = stats_get_csv( 'postviews', array( 'days' => 6, 'limit' => 30 ) );
                                       set_transient( 'trans_evo_topposts', $top_posts, 7200); 
                                       /* attempt to cache a transient for 2 hours */
                                 }

    PS: Иногда можно кешировать не только полученное значение, но и кусок HTML-кода (через ob_start() и ob_end_flush())
    Например для связанных записей.

    вот например stats_get_csv делает запрос к статистике Jetpack получая 30 самых просматриваемых записей за 6 дней,
    делать это постоянно — глупость, поэтому получаем (если нет в кеше) и кешируем на 7200 секунд.

    • Ответ изменён 6 месяцев, 2 недели назад пользователем Yui.

    Зачем мне это знать,

    Как минимум для того, чтобы не тратить чужое время на споры и чтение ереси типа

    У стандартного ВП никакого кэширования нет.

    Никакого отношения к ВП не имеет.

    и т.п.

    Я не любитель велосипедостроительства

    Вы просто любитель. Любитель в ВП, любитель поспорить. Хотя нет. В бесполезных спорах и Вы профессионал. Суперпрофи.
    Лучше бы тратили свою неуёмную энергию и кучу свободного времени на изучение ВП или другую полезную деятельность.

    тут достаточно приличные примеры кода

    Yui спасибо, направление раскопок понял. Будем считать топик решенным.

    но и кусок HTML-кода (через ob_start() и ob_end_flush())
    Например для связанных записей.

    Упсс… Вот про это как раз интересно.
    Я как раз и думал, что хорошо бы кешировать часть страницы — сам контент + блоки «похожих». Или хотя бы только весть блок с блоками. Чтобы не дёргать каждый раз базу.
    Но не знаю как это считается — «объект» или что иное. И соответственно не знаю как это реализовывать.

Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Тема «Кастомные поля и кеширование» закрыта для новых ответов.