Всем привет! В рамках реализации задачи по монетизации блога на wordpress мне пришла в голову мысль добавить партнерских программ на свой сайт, пертнерок тех компаний услагами которых я пользуюсь самостоятельно, но для реализации этой задачи нужно немного допилить wordpress, от сторонних плагинов по традиции решил отказаться потому что не хочу =) и к тому же для реализации такой простой задачи достаточно будет возможностей wordpress. Итак, поехали. Далее я опишу процесс создания системы партнерских программ для блога.
Для создания партнерок потребуется создать отдельный справочник записей, те зарегистрировать в системе еще один тип постов:
Открываем functions.php темы и добавляем туда что-то вроде:
add_action('init', 'register_post_types'); function register_post_types() { register_post_type('partner', [ 'label' => null, 'labels' => [ 'name' => 'Партнерки', 'singular_name' => 'partner', 'add_new' => 'Добавить партнерку', 'add_new_item' => 'Добавление партнерки', 'edit_item' => 'Редактирование пертнерки', 'new_item' => 'Новая партнерка', 'view_item' => 'Смотреть партнерку', 'search_items' => 'Искать патнерку', 'not_found' => 'Не найдено', 'not_found_in_trash' => 'Не найдено в корзине', 'parent_item_colon' => '', 'menu_name' => 'Партнерка', ], 'description' => '', 'public' => true, 'show_in_menu' => null, 'show_in_rest' => null, 'rest_base' => null, 'menu_position' => null, 'menu_icon' => null, 'hierarchical' => false, 'supports' => ['title', 'thumbnail'], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' 'taxonomies' => [], 'has_archive' => false, 'rewrite' => true, 'query_var' => true, ]); }
После сохранения в админке WP должен появится новый пункт ниже пунтка меню Записи с названием Партнерки. Теперь у нас есть новый зарегистрированный тип записей с минимальным набором полей ( название и изображение ) для добавления наших партнеров.
Но по-мимо изображения и название так же требуется добавления реферальной ссылки, для этого потребуется для нового типа с партнерами зарегистрировать кастомезированые поля записей, поэтому добавляем следующий код в functions.php
add_action('add_meta_boxes', 'my_extra_fields_meta_box', 1); function my_extra_fields_meta_box() { $post_type = 'partner'; add_meta_box('extra_fields', 'Дополнительные поля', 'extra_fields_box_func', $post_type, 'normal', 'high'); } function extra_fields_box_func($post) { ?> <p> Ссылка: <label> <input style="width: 100%;" type="text" name="extra[link]" value="<?= get_post_meta($post->ID, 'link', 1) ?>"/> </label> </p> <p> Комментарий: <textarea type="text" name="extra[description]" style="width:100%; height:50px;"><?= get_post_meta($post->ID, 'description', 1) ?></textarea> </p> <p> Количество переходов: <input type="text" name="extra[count]" value="<?= get_post_meta($post->ID, 'count', 1) ?>" disabled="disabled"> </p> <input type="hidden" name="extra_fields_nonce" value="<?= wp_create_nonce('extra_fields_nonce_id') ?>"/> <?php }
Я решил для своей системы добавить еще 2 свойства партнера, комментарий — для внутреннего использования и подсчета количества переходов по моей реферальной ссылке.
Для того чтобы дополнительные поля сохранялись так же требуется добавить следующий хук
add_action('save_post', 'my_extra_fields_save_on_update', 0); function my_extra_fields_save_on_update($post_id) { // базовая проверка if ( empty($_POST['extra']) || !wp_verify_nonce($_POST['extra_fields_nonce'], 'extra_fields_nonce_id') || wp_is_post_autosave($post_id) || wp_is_post_revision($post_id) ) { return false; } $extra = $_POST['extra']; // Все ОК! Теперь, нужно сохранить/удалить данные // Очищаем все данные $extra = array_map('sanitize_text_field', $extra); foreach ($extra as $key => $value) { // удаляем поле если значение пустое if (!$value) { delete_post_meta($post_id, $key); } else { update_post_meta($post_id, $key, $value); // add_post_meta() работает автоматически } } return $post_id; }
Админка готова! Теперь необходимо доработать шаблоны темы, чтобы партнерские программ начали выводится на сайт.
Забыл кое-что, прежде чем переходить к редактированию шаблонов нужно добавить еще функции для выборки партнера и функцию просирования. Для вывода партнерки я буду использовать рандомную выборку одной партнерской программы из всех. При помощи такой нехитрой функции это можно осуществить. Добавляем в functions.php такую функцию
function get_partner_random() { $query = new WP_Query([]); $query->query([ 'post_type' => 'partner', 'post_status' => 'publish', 'orderby' => 'rand', 'posts_per_page' => '1' ]); return $query->posts[0] ?? null; }
Так как я хочу увеличивать количество переходов на 1 каждый раз при переходе по моей реферальной ссылки требуется добавить функцию проксирования партнерских ссылок. Это можно сделать довольно просто добавив следующий хук в functions.php
add_action( 'init', 'init_proxy' ); function init_proxy() { if ( isset($_GET['action']) && $_GET['action'] == 'partner' && isset($_GET['id']) && is_numeric($_GET['id']) ) { $query = new WP_Query([]); $query->query([ 'post_type' => 'partner', 'ID' => (int)$_GET['id'], 'post_status' => 'publish', 'posts_per_page' => '1' ]); $posts = $query->get_posts(); if (!empty($posts[0]->ID)) { $count = (int)get_post_meta($posts[0]->ID, 'count', true); $count++; update_post_meta($posts[0]->ID, 'count', $count); header('Location: ' . get_post_meta($posts[0]->ID, 'link', true)); exit; } } }
Теперь уже точно можно перейти к шаблону сайта. Тут все зависит от сложности шаблона. В моем случае шаблон очень простой поэтому править потребуется не так много
Добавляем новый шаблон для партнерок:
<?php /** @var WP_Post $partner */ $partner = get_partner_random(); ?> <?php if ($partner): ?> <article> <header class="entry-header"> <header class="entry-header"> <h2 class="entry-title"><a href="<?php echo sprintf('/?action=partner&id=%d', $partner->ID) ?>" rel="bookmark"><?php echo $partner->post_title?></a></h2> </header> <div class="post-thumbnail"> <a href="<?php echo sprintf('/?action=partner&id=%d', $partner->ID) ?>"> <?php echo get_the_post_thumbnail( $partner->ID, 'large'); ?> </a> </div><!-- .post-thumbnail --> <div class="nav-links"> <div class="nav-next kc-nav-links"> <a href="<?php echo sprintf('/?action=partner&id=%d', $partner->ID) ?>">Взглянуть →</a> </div> </div> </header> </article> <?php endif ?>
И далее добавляем логику вывода этого шаблона в index.php темы
get_template_part( 'header' ); if ( have_posts() ) : $i = 1; while ( have_posts() ) : the_post(); get_template_part( 'content' ); // If comments are open or we have at least one comment, load up the comment template. if ( comments_open() || get_comments_number() ) : comments_template(); endif; if ($i % 5 == 0) { get_template_part( 'partner' ); } $i++; endwhile; else : get_template_part( 'content', 'none' ); endif; ?>
В этом куске кода я скинул шаблон полностью для наглядности, но по-сути вся правка заключается в добавлении вот этой простой логики:
if ($i % 5 == 0) { get_template_part( 'partner' ); }
Этот код будет отображать рандомную партнерку после каждых 5 постов
Ну вот и все. Вот один из быстрых и дешевых способов как можно реализовать систему партнерских реферальных программ в своем блоге на WordPress. Конечно подобную систему можно улучшить, а так же в ней есть ряд недостатков, но для начала этого будет достаточно.
А если вам нужна разработка под WP или любая другая помощь по php, можете написать мне в любое время в мой телеграмм на странице профайла