Вопрос или проблема
Я хочу отфильтровать URL-адрес src каждого изображения (каждого img
тега) на всех своих страницах WordPress с целью добавления строки запроса в конец URL-адреса изображения. (Причины этого находятся вне рамок моего вопроса).
Как я понимаю, я должен иметь возможность использовать фильтр wp_get_attachment_image_src для достижения этой цели.
Я нашёл этот пример фильтра, который, как предполагается, должен решить задачу:
function change_src($image, $attachment_id, $size, $icon)
{
$image[0] .= '?ver=123';
return $image;
}
add_filter('wp_get_attachment_image_src', 'change_src', 10, 4);
Также есть другая функция, представленная на Изменить URL изображения на CDN, которая также предполагается для достижения этой цели.
Однако, когда я тестирую любую из этих двух функций на своем сайте, она изменяет только src
URL-адресы изображений, используемых на страницах. Она не меняет URL других изображений на моих страницах. Другие изображения были добавлены с помощью кнопки “Добавить медиа” в редакторе, и я предполагаю, что на все они должен влиять этот фильтр.
Мои вопросы:
-
Ожидается ли такое поведение, что фильтр
wp_get_attachment_image_src
влияет только на избранное изображение страницы, а не на изображения в содержимом страницы, которые были добавлены через кнопку “Добавить медиа”? -
Если это не ожидаемое поведение, то что может быть причиной того, что этот фильтр не срабатывает на других изображениях на моем сайте?
-
Если это да ожидаемое поведение, можете ли вы предложить альтернативную функцию, которая будет работать на всех моих изображениях? Обратите внимание, что я предпочёл бы использовать правильный фильтр WordPress для достижения этого, а не какой-то поиск и замену в содержимом страницы.
Также я понимаю, что мне нужно использовать фильтр wp_calculate_image_srcset
для изменения URL изображений внутри части srcset
тега img. Я протестировал это, используя функцию, представленную на Изменить URL изображения на CDN, и это действительно работает корректно на всех изображениях на моих страницах. Поэтому мне особенно непонятно, почему wp_calculate_image_srcset
работает на всех моих изображениях, но wp_get_attachment_image_src
нет.
Надеюсь, кто-то сможет направить меня в правильном направлении!
Ожидается ли такое поведение, что фильтр wp_get_attachment_image_src влияет только на избранное изображение страницы, а не на изображения в содержимом страницы, которые были добавлены через кнопку “Добавить медиа”?
Да, этот фильтр не срабатывает на URL изображений после сохранения поста.
Если это не ожидаемое поведение, то что может быть причиной того, что этот фильтр не работает на других изображениях на моем сайте?
Это ожидаемое поведение, этот фильтр и другие не срабатывают на контенте, в котором URL уже сохранены в базе данных. Он влияет только на места, где ID вложения должен быть преобразован во время выполнения в URL.
Если это ожидаемое поведение, можете ли вы предложить альтернативную функцию, которая будет работать на всех моих изображениях? Обратите внимание, что я предпочёл бы использовать правильный фильтр WordPress для достижения этого, а не какой-то поиск и замену в содержимом страницы.
Такого фильтра не существует, вам придется как-то выполнить поиск и замену в содержимом страницы. Обратите внимание, что это потребует сброса всех кэшей и будет несовместимо с множеством плагинов кэширования и систем кэширования CDN, таких как Cloudflare, если ваша цель – сбить кэш изображений. Было бы проще дать им новые URL.
Также вам нужно будет отрегулировать множество фильтров и использовать различные буферы вывода. Например, вам может показаться достаточным использовать фильтр the_content
или буфер вывода, но это не решит проблемы с запросами к REST API, которые использует некоторый JS.
используйте
function custom_attachment_url($url, $post_id) {
// Проверяем, является ли вложение изображением
$url .= '?foo=bar';
return $url;
}
add_filter('wp_get_attachment_url', 'custom_attachment_url', 10, 2);
используемое вами image[0]
получает первое изображение на каждой странице, которое является изображением из заголовка.
Ответ или решение
Для того чтобы фильтровать URL-адреса изображений (все теги <img>
) на всех страницах вашего сайта на WordPress, вам необходимо учитывать несколько важных аспектов. Рассмотрим каждый из них по порядку.
1. Ожидаемое поведение фильтра wp_get_attachment_image_src
Фильтр wp_get_attachment_image_src
предназначен для изменения URL изображений только во время выполнения функций, требующих преобразования идентификатора вложения в URL. Он не затрагивает изображения, которые уже есть в содержимом поста и были добавлены через кнопку "Добавить медиа". Таким образом, да, это ожидаемое поведение, и фильтр действительно не будет работать на всех изображениях в содержимом поста.
2. Причины неработоспособности фильтра для других изображений
Фильтры такие как wp_get_attachment_image_src
, wp_get_attachment_image
и другие используются на этапе вызова вложений и их ID. После того как пост сохранён, URL назначаются напрямую, и данные сохраняются в базе данных. Поэтому фильтры, изменяющие URL, такие как wp_get_attachment_image_src
, не будут применяться к изображениям, которые включены непосредственно в текст поста.
3. Альтернативные функции для фильтрации всех изображений
Для решения вашей задачи потребуется использовать фильтры, которые применяются к содержимому поста. Одним из подходящих решений будет фильтрация контента через the_content
. В данном контексте необходимо использовать регулярные выражения или стандартные функции замены строк в PHP.
Пример функции, которая добавляет строку запроса к URL изображений в контенте:
function filter_image_urls($content) {
// Используем регулярное выражение для нахождения всех тегов img
$content = preg_replace_callback('/<img.*?src=["\'](.*?)["\'].*?>/i', function($matches) {
$url = $matches[1];
// Добавляем к URL вашу строку запроса
return str_replace($url, $url . '?ver=123', $matches[0]);
}, $content);
return $content;
}
add_filter('the_content', 'filter_image_urls');
Важно обратить внимание
-
Кэширование: Если вы применяете подобные изменения, обратите внимание на кэширование. Вам может потребоваться очистить кэш вашего сайта и настроить правила кэширования для CDN, такие как Cloudflare, если вы используете его.
-
REST API: Не забывайте о том, что при таком подходе вам также нужно будет учитывать REST API запросы, которые могут использовать оригинальные URL изображений. Это может усугубить ваши задачи по поддержке правильных изображений.
-
Оптимизация URL: Оцените, нужно ли вам генерировать новые URL для изображений для каждого запроса. Иногда лучше использовать уникальные URL-адреса, чтобы избежать столкновений и проблем с кэшем.
Следуя этим шагам и рекомендации, вы сможете эффективно фильтровать URL-адреса всех изображений на своих страницах, с добавлением желаемых параметров ко всем изображениям, а не только к избранным.