Статьи

Как создать сайт RSS Syndicator с помощью WordPress

В этом руководстве я расскажу о том, как создать синдикатор или пинг-сайт с использованием функциональности WordPress. Эта функция может быть полезна для владельцев, которые хотят создать каталог статей, который позволит их пользователям отправлять статьи на их сайт с помощью RSS. Чтобы дать некоторое представление о том, как может выглядеть такой сайт, я настроил демонстрационный RSS-сайт для этого урока. Теперь начнем.


Сначала нам нужно настроить место, где пользователи могут добавлять свои 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 / . Функция будет загружена без необходимости активировать ее как обычный плагин.


После того, как мы настроили наш собственный тип записи, чтобы сохранить 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] форму в соответствии с дизайном вашего сайта. Возможно, вы захотите, чтобы только зарегистрированный пользователь мог видеть и использовать эту страницу.


Поскольку в нашей базе данных уже есть 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 . Если у вас есть какие-либо предложения или улучшения для этого урока, я с нетерпением жду возможности прочитать идеи и предложения в комментариях ниже.