Вопрос или проблема
Моя цель:
Я хочу, чтобы внешние ссылки на магазины, с которыми я сотрудничаю (например, Amazon), автоматически получали прикрепленный к ним идентификатор аффилиата.
Пример:
Ссылка, которую я вставляю в редактор блога https://www.amazon.com/dp/B07K344J3N/
изменяется на фронтенде на https://www.amazon.com/dp/B07K344J3N/?tag=myafftag-02
Что я нашел:
Создатель темы, которую я использую, предлагает что-то очень близкое к тому, что мне нужно:
add_action('wpfepp_form_actions', 'link_change_custom');
function link_change_custom($data){
if ( !empty( $_POST['rehub_offer_product_url'] ) ) {
$url = $_POST['rehub_offer_product_url'];
$checkdomain = 'amazon.com';
if (!empty($url) && strpos($url, $checkdomain) !== false) :
$afftag = 'myafftag-02'; //наш идентификатор аффилиата
$affstring = 'tag='; // параметр URL для идентификатора аффилиата
if (parse_url($url, PHP_URL_QUERY)): //проверяем, есть ли в ссылке строка запроса
if (strpos($affstring, $url) !== false) : //проверяем, есть ли в ссылке уже идентификатор аффилиата
$url = preg_replace("/(".$affstring.").*?(\z|&)/", "$1".$afftag."$2", $url);
else:
$url = $url.'&'.$affstring.$afftag;
endif;
else:
$url = $url.'?'.$affstring.$afftag;
endif;
endif;
update_post_meta( $data['post_id'], 'rehub_offer_product_url', esc_url($url) );
}
}
Проблема:
Это работает только со ссылками, которые хранятся в поле “rehub_offer_product_url”, но я хочу, чтобы это работало с любыми ссылками на Amazon, которые я вставляю в содержимое своих блогов.
Буду благодарен за любую помощь.
Код, который вы нашли, работает, если вы используете классический редактор. Он принимает данные POST (то есть запрос POST HTTP) и преобразует их перед тем, как они попадут в базу данных. Таким образом, помимо обновления определенного метаполя, он также работает только с того момента, как вы добавите код. Старые ссылки не затрагиваются.
Предполагая, что вы, вероятно, хотите затронуть существующие ссылки, а не только новые, вы можете использовать фильтр the_content
. Это будет работать как в классическом редакторе, так и в блоковом редакторе.
Это должно направить вас на правильный путь – вам просто нужно будет разработать правильное регулярное выражение для идентификации строки запроса ссылок Amazon. (Если вы уже знаете, что ни одна из ваших ссылок Amazon не имеет строк запроса, вы можете пропустить регулярное выражение и просто перейти к шагу str_replace()
.)
<?php
// Добавляем фильтр к `the_content`, который вызывается при извлечении данных сообщения из базы данных
add_filter('the_content', 'wpse_357790_add_amazon_affiliate');
function wpse_357790_add_amazon_affiliate($content) {
// Проверяем, найдено ли "amazon.com" в содержимом сообщения
if(strpos($content, 'amazon.com') !== false) {
// Захватываем все ссылки Amazon и их строки запроса
// TO DO: разработать правильное регулярное выражение здесь. Эта строка не завершена.
preg_match_all('\?tag=[^&]+(&|")', $content, $matches);
// Добавляем строку запроса аффилиата к каждой URL
foreach($matches as $url) {
$content = str_replace($url, $url . '?tag=myafftag-02', $content);
}
}
// Всегда возвращаем содержимое, даже если мы его не изменили
return $content;
}
?>
Преимущества: будет работать с любым редактором, фильтрует все содержимое поста, работает со всем содержимым – уже опубликованным и еще не созданным.
Мне нужна была такая же автоматическая функция на одном из моих сайтов: необходимость изменять любую ссылку на Amazon, добавляя мой аффилиат-код, будь то ссылка в посте, страница или комментарий. Я не смог найти плагин, который бы это делал, поэтому я создал свой собственный.
Он называется “AmazoLinkenator” здесь https://wordpress.org/plugins/amazolinkenator/. Вы можете посмотреть код внутри, если хотите “форкнуть” его, или просто использовать плагин. (Я отмечаю, что мне следует изменить значение ‘tested to’ на 5.3; он работает нормально в текущей версии WP.) Поддержка через страницу плагина.
Но все, что вам нужно, это правильное регулярное выражение, чтобы найти/заменить любые ссылки на Amazon. (Мне пришлось добавить код для обработки сокращенных URL.) Для выполнения замены требуется около 80-100 строк кода.
Кроме того, если у вас есть код API Bit.ly, он будет сокращать URL, которые он находит. Работает только для ссылок Amazon.
Ответ или решение
Чтобы автоматически изменять ссылки на Amazon и добавлять к ним ваш аффилиатский идентификатор, вы можете использовать фильтр the_content
в WordPress. Этот метод позволит вам обработать как уже опубликованные, так и будущие посты, что делает его наиболее удобным и универсальным решением.
Вот пример кода, который вы можете добавить в файл functions.php
вашей темы или в плагин:
<?php
// Добавляем фильтр к содержимому поста
add_filter('the_content', 'add_amazon_affiliate_tag');
function add_amazon_affiliate_tag($content) {
// Проверяем наличие "amazon.com" в содержимом поста
if (strpos($content, 'amazon.com') !== false) {
// Задаем наш аффилиатский ID
$afftag = 'myafftag-02';
// Используем регулярное выражение для поиска всех ссылок на Amazon
$pattern = '/(https?:\/\/(?:www\.)?amazon\.com\/[^\s"\'<>]+)/';
// Функция, которая будет использоваться для замены
$content = preg_replace_callback($pattern, function($matches) use ($afftag) {
// Получаем URL
$url = $matches[0];
// Проверяем, есть ли уже параметр "tag" в URL
if (parse_url($url, PHP_URL_QUERY)) {
// Если параметр "tag" уже существует, заменяем его
if (strpos($url, 'tag=') !== false) {
return preg_replace('/(tag=)[^&]*/', '$1' . $afftag, $url);
} else {
// Если параметра нет, добавляем новый параметр
return $url . '&tag=' . $afftag;
}
} else {
// Если URL не имеет параметров, добавляем "tag"
return $url . '?tag=' . $afftag;
}
}, $content);
}
return $content;
}
?>
Как это работает?
-
Фильтр
the_content
: Данный фильтр срабатывает при выводе содержимого поста. Он проверяет, содержит ли текст поста ссылки на Amazon. -
Регулярное выражение: Используем регулярное выражение для поиска всех ссылок, которые начинаются с
http://
илиhttps://
, и заканчиваются наamazon.com
. -
Обработка ссылок: Используя функцию
preg_replace_callback
, мы проверяем каждую найденную ссылку:- Если в ссылке уже есть параметр
tag
, заменяем его на ваш аффилиатский ID. - Если параметра
tag
нет, добавляем его. - Если в ссылке нет других параметров, добавляем
?tag=
.
- Если в ссылке уже есть параметр
Дополнительные рекомендации:
- Убедитесь, что вы используете правильный идентификатор аффилиата.
- Перед применением кода лучше протестировать его на тестовом сайте, чтобы избежать непредвиденных ошибок.
- Если вам нужно будет обрабатывать более сложные URL, возможно, нужно будет доработать регулярное выражение.
Этот код позволяет автоматически преобразовывать все ссылки на Amazon в ваших постах, поэтому вы можете быть уверены, что все ссылки будут вести к вам с вашим аффилиатским идентификатором.