Как применить фильтр к get_the_post_thumbnail()

Вопрос или проблема

Мой клиент хочет, чтобы я добавил пользовательские поля для миниатюры, поэтому логика будет следующей:

если custom_thumbnail пустой, отображать оригинал.
Но мне не нравится идея писать условные операторы повсюду + я использую SEO плагины для open graph и изображений, так что теперь мне нужно использовать фильтры для реализации пользовательской миниатюры.

Я думал о фильтрах wp, но не нашел фильтр для get_the_post_thumbnail.

apply_filter('get_the_post_thumbnail',function(){
//мои условные операторы
})

Вы можете использовать фильтр post_thumbnail_html.
Этот фильтр применяется при возврате функции get_the_post_thumbnail.

apply_filters( 'post_thumbnail_html', $html, $post->ID, $post_thumbnail_id, $size, $attr );

Ответ или решение

Для решения проблемы с отображением миниатюр в WordPress в зависимости от наличия пользовательского поля, необходимо использовать фильтр post_thumbnail_html. Это оптимальное решение, так как оно позволяет избежать написания большого количества условных операторов, тем самым упрощая код и поддерживаемость вашего проекта.

Шаги по реализации:

  1. Создание пользовательского поля для миниатюры:
    Прежде всего, убедитесь, что вы создали пользовательское поле для обозначения нестандартных миниатюр. Если пользовательское поле с названием custom_thumbnail пусто, будет отображаться стандартная миниатюра.

  2. Использование фильтра post_thumbnail_html:
    Этот фильтр позволяет вам изменить HTML-код, возвращаемый функцией get_the_post_thumbnail(). Давайте напишем функцию, которая применяет этот фильтр.

  3. Пример кода:
    Вставьте следующий код в ваш файл functions.php вашей темы:

    function custom_post_thumbnail_html($html, $post_id, $post_thumbnail_id, $size, $attr) {
       // Получаем значение пользовательского поля
       $custom_thumbnail = get_post_meta($post_id, 'custom_thumbnail', true);
    
       // Если пользовательское поле не пусто, используем его
       if (!empty($custom_thumbnail)) {
           // Вернем HTML-код пользовательской миниатюры
           return '<img src="' . esc_url($custom_thumbnail) . '" alt="' . esc_attr(get_the_title($post_id)) . '" />';
       }
    
       // Если пользовательское поле пусто, вернем оригинальную миниатюру
       return $html;
    }
    add_filter('post_thumbnail_html', 'custom_post_thumbnail_html', 10, 5);

Объяснение кода:

  • Получение пользовательского поля: С помощью функции get_post_meta() мы получаем значение поля custom_thumbnail для текущей записи.
  • Проверка заполненности поля: Если поле не пусто, мы генерируем HTML-код для изображения, используя URL из пользовательского поля. Также используется функция esc_url() для защиты от XSS-уязвимостей.
  • Возврат оригинальной миниатюры: Если пользовательское поле пусто, возвращается стандартный HTML-код миниатюры, полученный из переменной $html.

SEO-оптимизация:

В этом коде мы используем функции esc_url() и esc_attr() для экранирования URL-адреса и атрибутов, что помогает сохранить безопасность и целостность вашего сайта. Убедитесь, что у вас есть правильные атрибуты alt для изображений — это не только улучшает SEO, но и делает ваш сайт более доступным.

Заключение:

Использование фильтра post_thumbnail_html является эффективным и элегантным способом изменить поведение функции get_the_post_thumbnail(), минимизируя количество условных операторов. Это не только повышает читаемость и поддерживаемость вашего кода, но и помогает более гибко управлять контентом на вашем сайте.

Оцените материал
Добавить комментарий

Капча загружается...