Проблема: неактивные affiliate ссылки снижают конверсию и SEO
На affiliate сайтах с WooCommerce часто возникает ситуация, когда партнерские ссылки становятся неактивными — товары снимаются с продажи, ссылки меняются или партнерская программа прекращается. Если такие ссылки оставлять активными, пользователи столкнутся с ошибками или 404, что негативно влияет на доверие и позиции сайта.
Ручное отслеживание и отключение таких ссылок неудобно и требует много времени. Поэтому нужна автоматизация отключения неактивных affiliate ссылок прямо в WooCommerce.
Диагностика: как выявить неактивные affiliate ссылки
Первый шаг — определить, какие ссылки не работают. Для этого можно использовать несколько подходов:
- Проверка HTTP-кодов ответов URL партнерских продуктов.
- Поиск в базе данных WooCommerce товаров с нерабочими или пустыми ссылками.
- Отслеживание кликов с помощью плагинов и выявление низкой или нулевой активности.
Пример функции для проверки доступности URL с помощью PHP:
function check_url_status($url) {
$headers = @get_headers($url);
if($headers && strpos($headers[0], '200') !== false) {
return true;
}
return false;
}Эту функцию можно использовать для проверки каждой affiliate ссылки перед ее отображением или в рамках плановой проверки.
Пошаговое решение: автоматическое отключение неактивных affiliate ссылок
1. Определение кастомного мета-поля для affiliate ссылки в WooCommerce
В WooCommerce affiliate товар обычно хранит ссылку в мета-поле (например, '_affiliate_url'). Если у вас другое поле, замените в кодах ниже соответствующее название.
2. Скрипт для проверки и отключения неактивных ссылок
Создаем WP-Cron задачу, которая периодически проверяет ссылки и отключает товары с нерабочими ссылками (переключает статус товара в 'draft').
add_action('wp', 'schedule_affiliate_link_check');
function schedule_affiliate_link_check() {
if (!wp_next_scheduled('check_affiliate_links_event')) {
wp_schedule_event(time(), 'daily', 'check_affiliate_links_event');
}
}
add_action('check_affiliate_links_event', 'check_and_disable_inactive_affiliate_links');
function check_and_disable_inactive_affiliate_links() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_affiliate_url',
'compare' => 'EXISTS'
]
]
];
$products = get_posts($args);
foreach ($products as $product) {
$affiliate_url = get_post_meta($product->ID, '_affiliate_url', true);
if ($affiliate_url && !check_url_status($affiliate_url)) {
// Деактивируем товар
wp_update_post([
'ID' => $product->ID,
'post_status' => 'draft'
]);
}
}
}3. Проверка доступности URL
Используем функцию check_url_status из предыдущего раздела. Если ссылка недоступна — товар ставится в черновики, то есть исчезает с витрины.
Проверка результата после внедрения
- Запустите вручную функцию
check_and_disable_inactive_affiliate_linksчерез админ-панель, например, временно подключив вызов из темы или через WP CLI. - Проверьте, что товары с недоступными ссылками изменили статус на 'draft' и пропали с каталога.
- Проверьте, что товары с рабочими ссылками остались активными.
- Убедитесь, что WP-Cron запускается (например, с помощью плагина WP Crontrol) и задача выполняется по расписанию.
Частые ошибки и как их исправить
- Ошибка: WP-Cron не запускается автоматически.
Решение: Проверьте, что на сервере разрешен запуск WP-Cron или настройте системный cron для вызова wp-cron.php. - Ошибка: Функция
get_headersвозвращает false из-за блокировок хостинга.
Решение: Используйте альтернативные методы проверки URL — curl или wp_remote_head:function check_url_status($url) { $response = wp_remote_head($url); if (!is_wp_error($response)) { $status = wp_remote_retrieve_response_code($response); return $status === 200; } return false; } - Ошибка: Не все affiliate ссылки хранятся в одном мета-поле.
Решение: Проверьте структуру товаров и адаптируйте мета-запрос в get_posts.
Практические советы по безопасности и производительности
- Проверка ссылок может создавать нагрузку. Используйте кеширование результатов проверки, например, сохраняйте статус ссылки в мета-поле с датой проверки.
- Для больших сайтов запускайте проверку партиями (например, по 50 товаров за один запуск), чтобы не превышать лимиты времени выполнения.
- Убедитесь, что доступ к WP-Cron и админке защищен, чтобы злоумышленники не инициировали массовые проверки или изменения.
Сравнение вариантов реализации
| Способ | Плюсы | Минусы |
|---|---|---|
| Проверка с get_headers | Простота реализации, стандартный PHP | Может быть заблокирована хостингом, медленнее |
| Проверка с wp_remote_head | Использует WordPress HTTP API, лучше совместимость | Зависит от настроек сервера, сложнее отладка |
| Ручная проверка и отключение | Контроль со стороны администратора | Трудозатратно, риск пропуска неактивных ссылок |