Всем привет! В рамках реализации задачи по монетизации блога на 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, можете написать мне в любое время в мой телеграмм на странице профайла