Как создать автоматический affiliate каталог с описанием и ценами в WordPress

Для affiliate сайтов на WordPress важна возможность автоматически отображать каталог продуктов с актуальными описаниями и ценами. Это позволяет поддерживать сайт в свежем состоянии без постоянного ручного обновления. В этой статье мы подробно рассмотрим, как создать такой каталог, используя возможности WordPress, REST API партнерских программ, а также реализуем кэширование для оптимизации производительности.

Почему автоматический affiliate каталог важен для сайта

Ручное обновление описаний и цен для affiliate продуктов — это трудоемкий и ошибочный процесс. Цены меняются, товары появляются и исчезают. Автоматизация позволяет:

  • Экономить время на обновление контента
  • Поддерживать актуальность информации для посетителей
  • Улучшать позиции в поисковых системах за счет свежего контента
  • Повысить доверие пользователей благодаря точным данным

Для реализации такой системы мы будем использовать WordPress REST API, системное кэширование и PHP код для интеграции с партнерской сетью.

Выбор источника данных для affiliate каталога

Большинство партнерских программ предоставляют API для получения информации о товарах, ценах и описаниях. Примеры партнерских сетей с API:

  • Amazon Product Advertising API
  • AliExpress Affiliate API
  • Admitad API
  • ActionPay API

В качестве примера возьмем простой REST API, который возвращает JSON с товарами. Для реальных проектов подставьте API вашей партнерской программы.

Пример ответа API

{
  "products": [
    {
      "id": "12345",
      "title": "Пример товара",
      "description": "Краткое описание товара",
      "price": "1990",
      "currency": "RUB",
      "affiliate_url": "https://partner.ru/product/12345?aff_id=wpaffiliate"
    },
    ...
  ]
}

Создание функции для получения и кэширования данных каталога

Для снижения нагрузки на API партнера и быстрого отображения данных реализуем кэширование с помощью Transients API в WordPress. При запросе данных сначала проверяем кеш, если данных нет — загружаем через API и сохраняем в кеш.

function wpaffiliate_get_affiliate_products() {
    $cache_key = 'wpaffiliate_products_cache';
    $products = get_transient($cache_key);
    if (false === $products) {
        $response = wp_remote_get('https://api.partner.ru/products?limit=20');
        if (is_wp_error($response)) {
            return [];
        }
        $body = wp_remote_retrieve_body($response);
        $data = json_decode($body, true);
        if (empty($data['products'])) {
            return [];
        }
        $products = $data['products'];
        set_transient($cache_key, $products, 12 * HOUR_IN_SECONDS); // кешируем на 12 часов
    }
    return $products;
}

Вывод каталога на странице с пагинацией

Создадим шорткод для вывода каталога с пагинацией и фильтрами. Для простоты пагинация реализована на PHP, но можно и через AJAX при желании.

function wpaffiliate_display_affiliate_catalog($atts) {
    $atts = shortcode_atts([
        'posts_per_page' => 10,
        'paged' => 1,
    ], $atts, 'wpaffiliate_catalog');

    $products = wpaffiliate_get_affiliate_products();
    if (empty($products)) {
        return '<p>Каталог товаров временно недоступен.</p>';
    }

    $paged = max(1, intval($_GET['paged'] ?? $atts['paged']));
    $offset = ($paged - 1) * $atts['posts_per_page'];
    $paged_products = array_slice($products, $offset, $atts['posts_per_page']);

    ob_start();
    echo '<div class="wpaffiliate-catalog">';
    foreach ($paged_products as $product) {
        echo '<div class="wpaffiliate-product">';
        echo '<h3>' . esc_html($product['title']) . '</h3>';
        echo '<p>' . esc_html($product['description']) . '</p>';
        echo '<p><strong>Цена: ' . esc_html($product['price']) . ' ' . esc_html($product['currency']) . '</strong></p>';
        echo '<p><a href="' . esc_url($product['affiliate_url']) . '" target="_blank" rel="nofollow noopener">Купить</a></p>';
        echo '</div>';
    }
    echo '</div>';

    // Пагинация
    $total_pages = ceil(count($products) / $atts['posts_per_page']);
    if ($total_pages > 1) {
        echo '<div class="wpaffiliate-pagination">';
        for ($i = 1; $i <= $total_pages; $i++) {
            if ($i === $paged) {
                echo '<span class="current-page">' . $i . '</span>';
            } else {
                $url = add_query_arg('paged', $i);
                echo '<a href="' . esc_url($url) . '">' . $i . '</a>';
            }
        }
        echo '</div>';
    }

    return ob_get_clean();
}
add_shortcode('wpaffiliate_catalog', 'wpaffiliate_display_affiliate_catalog');

Добавление фильтров и сортировки по цене

Чтобы улучшить юзабилити, добавим возможность фильтровать товары по диапазону цен и сортировать по возрастанию или убыванию.

Для этого расширим шорткод, обрабатывая GET-параметры min_price, max_price и sort.

function wpaffiliate_display_affiliate_catalog_with_filters($atts) {
    $atts = shortcode_atts([
        'posts_per_page' => 10,
        'paged' => 1,
    ], $atts, 'wpaffiliate_catalog');

    $products = wpaffiliate_get_affiliate_products();
    if (empty($products)) {
        return '<p>Каталог товаров временно недоступен.</p>';
    }

    // Фильтрация по цене
    $min_price = isset($_GET['min_price']) ? floatval($_GET['min_price']) : 0;
    $max_price = isset($_GET['max_price']) ? floatval($_GET['max_price']) : INF;

    $products = array_filter($products, function($product) use ($min_price, $max_price) {
        $price = floatval($product['price']);
        return $price >= $min_price && $price <= $max_price;
    });

    // Сортировка
    $sort = $_GET['sort'] ?? 'asc';
    usort($products, function($a, $b) use ($sort) {
        $price_a = floatval($a['price']);
        $price_b = floatval($b['price']);
        if ($price_a == $price_b) return 0;
        if ($sort === 'desc') {
            return ($price_a < $price_b) ? 1 : -1;
        } else {
            return ($price_a > $price_b) ? 1 : -1;
        }
    });

    $paged = max(1, intval($_GET['paged'] ?? $atts['paged']));
    $offset = ($paged - 1) * $atts['posts_per_page'];
    $paged_products = array_slice($products, $offset, $atts['posts_per_page']);

    ob_start();
    // Форма фильтров
    echo '<form method="get" class="wpaffiliate-filter-form">';
    echo '<label>Мин. цена: <input type="number" name="min_price" value="' . esc_attr($min_price) . '" step="0.01" /></label>';
    echo '<label>Макс. цена: <input type="number" name="max_price" value="' . (is_infinite($max_price) ? '' : esc_attr($max_price)) . '" step="0.01" /></label>';
    echo '<label>Сортировать: <select name="sort">';
    echo '<option value="asc"' . selected($sort, 'asc', false) . '>По возрастанию</option>';
    echo '<option value="desc"' . selected($sort, 'desc', false) . '>По убыванию</option>';
    echo '</select></label>';
    echo '<button type="submit">Применить</button>';
    echo '</form>';

    echo '<div class="wpaffiliate-catalog">';
    if (empty($paged_products)) {
        echo '<p>Товары не найдены по заданным параметрам.</p>';
    } else {
        foreach ($paged_products as $product) {
            echo '<div class="wpaffiliate-product">';
            echo '<h3>' . esc_html($product['title']) . '</h3>';
            echo '<p>' . esc_html($product['description']) . '</p>';
            echo '<p><strong>Цена: ' . esc_html($product['price']) . ' ' . esc_html($product['currency']) . '</strong></p>';
            echo '<p><a href="' . esc_url($product['affiliate_url']) . '" target="_blank" rel="nofollow noopener">Купить</a></p>';
            echo '</div>';
        }
    }
    echo '</div>';

    // Пагинация с сохранением параметров
    $total_pages = ceil(count($products) / $atts['posts_per_page']);
    if ($total_pages > 1) {
        echo '<div class="wpaffiliate-pagination">';
        $query_args = $_GET;
        for ($i = 1; $i <= $total_pages; $i++) {
            $query_args['paged'] = $i;
            $url = add_query_arg($query_args);
            if ($i === $paged) {
                echo '<span class="current-page">' . $i . '</span>';
            } else {
                echo '<a href="' . esc_url($url) . '">' . $i . '</a>';
            }
        }
        echo '</div>';
    }

    return ob_get_clean();
}
remove_shortcode('wpaffiliate_catalog');
add_shortcode('wpaffiliate_catalog', 'wpaffiliate_display_affiliate_catalog_with_filters');

Интеграция с плагином Clearfy Pro для оптимизации

Для повышения скорости загрузки каталога и общей оптимизации сайта рекомендуем использовать Clearfy Pro. Плагин поможет:

  • Отключить ненужные скрипты и стили
  • Включить кэширование страниц и объектов
  • Оптимизировать базу данных
  • Обеспечить безопасность сайта

Используйте Clearfy Pro для стабильной и быстрой работы вашего affiliate каталога.

Заключение: что сделать дальше

Мы разобрали, как создать автоматический affiliate каталог с описанием и ценами в WordPress, используя API партнерской программы, кэширование и шорткод с пагинацией и фильтрами. Такой подход значительно упростит поддержку вашего сайта и улучшит пользовательский опыт.

Для расширения функционала можно добавить:

  • Автоматическое обновление каталога по cron
  • Интеграцию отзывов и рейтингов продуктов
  • Более сложные фильтры по категориям и брендам
  • AJAX загрузку товаров для плавной навигации

Также рекомендуем ознакомиться с другими продуктами WPSHOP для расширения возможностей WordPress.

Как создать собственный виджет для affiliate сайтов WordPress
30.11.2025
Как автоматически отключить неактивные affiliate ссылки в WooCommerce
18.05.2026
Как создать автоматический отчет по affiliate кампаниям в WordPress
26.12.2025
Как автоматизировать обновление цен affiliate продуктов в WordPress
30.01.2026
Как установить отслеживание affiliate кликов в WordPress без плагинов
06.01.2026