В этом руководстве я расскажу о том, как создать синдикатор или пинг-сайт с использованием функциональности WordPress. Эта функция может быть полезна для владельцев, которые хотят создать каталог статей, который позволит их пользователям отправлять статьи на их сайт с помощью RSS. Чтобы дать некоторое представление о том, как может выглядеть такой сайт, я настроил демонстрационный RSS-сайт для этого урока. Теперь начнем.
Шаг 1 Настройка заполнителя канала
Сначала нам нужно настроить место, где пользователи могут добавлять свои RSS-каналы. Сначала я подумал, что будет достаточно использовать существующий раздел профиля пользователя WordPress, но если мы хотим разрешить несколько веб-представлений, это может быть проблематично. Мы настроим новый пользовательский тип записи для обработки URL-адреса для RSS-канала пользователя. Вы можете узнать больше о пользовательских типах сообщений, прочитав статью о классе пользовательских типов сообщений .
Нам понадобятся 2 поля только для пользовательского типа записи, заголовка и места для добавления URL (я использую столбец выдержки, чтобы все было просто)
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/* New custom post type for new RSS handling.
add_action(‘init’, ‘create_rss_feed_uri’);
function create_rss_feed_uri() {
$labels = array(
‘name’ => _x(‘RSS’, ‘All the RSS’),
‘singular_name’ => _x(‘RSS’, ‘single item for rss’),
‘add_new’ => _x(‘Add New RSS’, ‘rss’),
‘add_new_item’ => __(‘Add New RSS’),
‘edit_item’ => __(‘Edit RSS’),
‘new_item’ => __(‘New RSS’),
‘view_item’ => __(‘View RSS’),
‘search_items’ => __(‘Search RSS’),
‘not_found’ => __(‘Nothing found’),
‘not_found_in_trash’ => __(‘Nothing found in Trash’),
‘parent_item_colon’ => »
);
$menu_args = array(
‘labels’ => $labels,
‘label’ => __(‘RSS’),
‘singular_label’ => __(‘RSS’),
‘public’ => true,
‘show_ui’ => true,
‘capability_type’ => ‘post’,
‘hierarchical’ => false,
‘revisions’ => true,
‘rewrite’ => true,
‘supports’ => array(‘title’, ‘excerpt’)
);
register_post_type(‘rss’,$menu_args);
}
|
Сохраните следующий код в новом файле ( rss_feed_functions.php ) и загрузите его в следующую папку / wp-content / mu-plugins / . Функция будет загружена без необходимости активировать ее как обычный плагин.
Шаг 2 Настройка отправки страницы RSS на пользовательскую страницу
После того, как мы настроили наш собственный тип записи, чтобы сохранить URL-адрес RSS, нам нужно настроить страницу, где пользователь может отправить свой URL-адрес. Следующая функция создаст форму, и вы можете включить ее на любую страницу, используя шорткод, который мы определили в коде.
Нам нужно поле ввода, чтобы пользователь мог добавить заголовок и URL для RSS.
|
1
2
3
4
5
|
<form action=»» method=»POST»>
<input type=»text» value»» name=»rss_title» />
<input type=»text» value»» name=»rss_uri» />
<input type=»submit» value»Submit» name=»submit» />
</form>
|
Следующая вещь, нам нужно обработать форму, как только она будет опубликована. Следующий код позволит нам подготовить запрос для вставки данных на наш сайт.
|
1
2
3
4
5
6
7
8
9
|
/* prepare and process the rss data */
$newrss_post = array(
‘post_title’ => $_POST[«rss_title»],
‘post_excerpt’ => $_POST[«rss_uri»],
‘post_author’ => $current_user->ID,
‘post_status’ => ‘publish’,
‘post_type’ => «rss»
);
$post_id = wp_insert_post( $newrss_post );
|
Но прежде чем вставлять все данные, которые мы получили из формы, мы хотели бы сначала проверить URL фида и заголовок. Чтобы легко проверить URL канала, мы будем использовать следующую функцию WordPress, чтобы проверить, возвращает ли URL канала действительный контент.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
include_once(ABSPATH . WPINC . ‘/feed.php’);
/*validate feed URL */
$rss = fetch_feed(esc_url($_POST[«rss_uri»]));
if (!is_wp_error( $rss ) ) :
/*prepare rss content */
$newrss_post = array(
‘post_title’ => esc_html($_POST[«rss_title»]),
‘post_excerpt’ => esc_url($_POST[«rss_uri»]),
‘post_author’ => $current_user->ID,
‘post_status’ => ‘publish’,
‘post_type’ => «rss»
);
/* insert rss details into database */
$post_id = wp_insert_post( $newrss_post );
else:
echo «There was error validating your RSS Feed, please try again»;
endif;
|
Если все работает хорошо, мы вставляем данные канала в базу данных. Полная функция с функцией шорткода будет выглядеть как код, показанный ниже, мы можем добавить полную функцию в наш файл rss_feed_functions.php .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
add_shortcode( ‘rss_form_submit’, ‘create_rss_feed_form’ );
/* Form to submit new RSS URL */
function create_rss_feed_form(){
echo ‘<form action=»» method=»POST»>
<input type=»text» value»»=»» name=»rss_title»>
<input type=»text» value»»=»» name=»rss_uri»>
<input type=»submit» value»submit»=»» name=»submit»>
</form>’;
if(isset($_POST[«rss_title»])):
/*validate feed URL */
$rss = fetch_feed(esc_url($_POST[«rss_uri»]));
if (!is_wp_error( $rss ) ) :
/*prepare rss content */
$newrss_post = array(
‘post_title’ => esc_html($_POST[«rss_title»]),
‘post_excerpt’ => esc_url($_POST[«rss_uri»]),
‘post_author’ => $current_user->ID,
‘post_status’ => ‘publish’,
‘post_type’ => «rss»
);
/* insert rss details into database */
$post_id = wp_insert_post( $newrss_post );
echo «RSS successfully submitted»;
else:
echo «There was error validating your RSS Feed, please try again»;
endif;
endif;
}
|
Теперь мы можем использовать [rss_form_submit] на любой из наших страниц, и вы можете [rss_form_submit] форму в соответствии с дизайном вашего сайта. Возможно, вы захотите, чтобы только зарегистрированный пользователь мог видеть и использовать эту страницу.
Шаг 3 Отправка статьи через фид URL
Поскольку в нашей базе данных уже есть URL-адрес канала, далее мы хотим обработать статью, которую пользователи хотят отправить на наш пинг-сайт. Для этого нам потребуется новая страница, и для обеспечения возможности использования этой функции в любых темах мы будем использовать тот же подход, что и при отправке URL фида для отправки статьи, используя функцию с шорткодом.
Прежде всего, нам нужно прочитать ленту от текущего пользователя.
|
1
2
3
4
5
6
7
8
9
|
global $current_user, $wpdb;
get_currentuserinfo();
/*custom query to retrieve custom post type without rendering it */
$rssfeed = $wpdb->get_results(» SELECT *
FROM $wpdb->posts
WHERE post_type = ‘rss’
AND post_status = ‘publish’
AND post_author = «.$current_user->ID.»»);
|
Если найден RSS-канал, то мы можем начать зацикливать URL-адрес канала и получать последнюю статью из канала.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
foreach ( $rssfeed as $post ):
setup_postdata( $post );
echo «<h3>».$post->post_title.»</h3>»;
$rss = fetch_feed(esc_url($post->post_excerpt));
if (!is_wp_error( $rss ) ) :
$item = $rss->get_item(0);
echo esc_html($item->get_title());
endif;
endforeach;
|
Теперь у нас уже есть первая статья, которую нужно вставить на наш сайт. Прежде чем мы продолжим добавлять его в базу данных, лучше сначала проверить, существует ли статья на нашем веб-сайте. Мы проверим заголовок элемента фида, если он уже существует, это просто базовый метод, вы можете проверить больше атрибутов, чтобы убедиться, что в базе данных нет дублирующихся статей.
|
1
2
3
4
5
|
if($wpdb->get_row(«SELECT post_title FROM $wpdb->posts WHERE post_title = ‘» . $item -> get_title(). «‘ AND post_status = ‘publish’ «, ‘ARRAY_A’)):
echo «No new article found»;
else:
echo esc_html($item->get_title());
endif;
|
Теперь мы можем обработать данные, которые мы получаем из канала в нашу базу данных. Чтобы упростить задачу для нашего пользователя, мы добавим форму отправки непосредственно после того, как получим и проверим URL.
|
1
2
3
4
5
6
7
8
|
echo ‘<form action=»» method=»POST»>
<strong>’.esc_html($item->get_title()).'</strong>
<input type=»hidden» value=»‘.esc_html($item->get_title()).'» name=»post_title»>
<input type=»hidden» value=»‘.esc_html($item->get_content()).'» name=»content»>
<input type=»hidden» value=»‘.esc_url($item->get_permalink()).'» name=»permalink»>
<input type=»hidden» value=»‘.$item->get_date(‘Ymd H:i:s’).'» name=»date»>
<input type=»submit» value=»Submit» name=»submit»>
</form>’;
|
В этом примере мы обрабатываем заголовок, контент, постоянные ссылки и дату для вставки в нашу базу данных. Пользователи увидят заголовок и кнопку отправки, как на скриншоте ниже.

Последний шаг, который нам нужно сделать, это вставить данные в базу данных. Мы готовим оператор, прежде чем выполнить запрос.
|
1
2
3
4
5
6
7
8
|
$prepare_content = array(
‘post_date’ => $_POST[«date»],
‘post_title’ => esc_html($_POST[«post_title»]),
‘post_content’ => $_POST[«content»],
‘post_author’ => $current_user->ID,
‘post_status’ => ‘publish’,
‘post_type’ => ‘rss’
);
|
Сначала мы обработаем эти детали, прежде чем вставлять дополнительные данные в наш пользовательский мета-блок.
|
1
2
|
$post_id = wp_insert_post( $prepare_content );
add_post_meta($post_id, ‘feed_item_permalink’, esc_url($_POST[«permalink»]));
|
Теперь все данные статьи успешно вставлены в базу данных. Теперь у нас есть синдикатор или пинг-сайт, готовый к использованию. Вы можете добавить больше возможностей для улучшения качества вашего сайта ping, но это было простое введение.
Вывод
Я включил полный исходный код (ссылка в верхней части этой статьи), который я использую на демо-сайте RSS . Если у вас есть какие-либо предложения или улучшения для этого урока, я с нетерпением жду возможности прочитать идеи и предложения в комментариях ниже.