Статьи

Создание виджета недавних постов от SimplePie

В этом руководстве я расскажу о SimplePie , создаю плагин для виджетов, который отображает недавно опубликованные статьи, запрашиваемые из фида WordPress с помощью SimplePie, и расскажу о быстродействии запросов к постам из фида WordPress вместо базы данных.

SimplePie — это бесплатный, очень быстрый и простой в использовании анализатор каналов, написанный на PHP, который выполняет всю грязную работу, связанную с извлечением, кэшированием, анализом, нормализацией структур данных между форматами, обработкой перевода кодировки символов и очисткой результирующие данные.

Чтобы установить и начать использовать SimplePie, выполните следующие действия:

  1. Скачайте библиотеку SimplePie и создайте две папки: php и cache .
  2. Загрузите library/ и autoloader.php в папку php вы только что создали.
  3. SimplePie теперь установлен и готов к использованию.

Давайте посмотрим, как использовать SimplePie для извлечения контента, найденного в ленте.

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
34
35
36
37
38
39
40
41
<?php
// Make sure SimplePie is included.
// the location of autoloader.php
 
require_once (‘../autoloader.php’);
 
// instantiate the SimplePie class
$feed = new SimplePie();
 
// Set the feed to process.
$feed->set_feed_url( ‘http://feeds.fedburner.com/tech4sky’ );
 
// Run SimplePie.
$feed->init();
 
// Send content to the browser as text/html and the UTF-8 character set.
$feed->handle_content_type();
?>
<!DOCTYPE html>
<head>
    <title>Sample SimplePie Page</title>
</head>
<body>
 
<div class=»header»>
  <h1><a href=»<?php echo $feed->get_permalink(); ?>»><?php echo $feed->get_title();
  <p><?php echo $feed->get_description();
</div>
 
<?php
// Here, we’ll loop through all of the items in the feed, and $item represents the current item in the loop.
foreach ( $feed->get_items() as $item ):
?>
 
  <div class=»item»>
    <h2><a href=»<?php echo $item->get_permalink(); ?>»><?php echo $item->get_title();
    <p><?php echo $item->get_description();
    <p><small>Posted on <?php echo $item->get_date(‘j FY | g:i a’);
  </div><!— .item —>
 
<?php endforeach;

SimplePie прост в установке и использовании, не так ли?

В следующем разделе мы будем создавать виджет, который отображает недавно опубликованные статьи, полученные из фида WordPress.

Многие из нас используют виджет для отображения последних сообщений на боковой панели нашего блога WordPress. Многие из этих плагинов запрашивают базу данных для получения недавно опубликованных статей.

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

Вместо того, чтобы запрашивать базу данных, мы могли бы извлечь недавно опубликованные статьи из нашего фида WordPress, используя SimplePie, что может значительно повысить производительность.

SimplePie имеет несколько встроенных параметров кэширования данных канала, поэтому вам не нужно каждый раз извлекать весь канал.

Одной из таких является file-based система кеширования, которая хранит элемент фида кеша в доступном для записи каталоге, что дополнительно повышает производительность.

Создать виджет в WordPress легко и просто.

Сначала WP_Widget класс WP_Widget , WP_Widget эти четыре метода: __construct() , widget() , form() , update() в классе и, наконец, зарегистрируйте виджет.

Виджет недавних постов при поддержке SimplePie
  1. Создайте класс, расширяющий WP_Widget
    1
    class Tutsplus_simplepie extends WP_Widget {}
  2. Дайте виджету имя и описание с помощью магического метода __construct()
    1
    2
    3
    4
    5
    6
    7
    function __construct() {
        parent::__construct(
            ‘tutsplus_widget’, // Base ID
            __(‘Recent Post powered by SimplePie’, ‘text_domain’), // Name
            array( ‘description’ => __( ‘Most recent posts generated from WordPress feed using SimplePie’, ‘text_domain’ ), )
        );
    }
  3. Метод widget() отображает внешний вид виджета.
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public function widget( $args, $instance ) {
     
        $feedURL = empty( $instance[‘feedURL’] ) ?
        $feedNumber = empty( $instance[‘feedNumber’] ) ?
        $showDate = empty( $instance[‘showDate’] ) ?
        $showDescription = empty( $instance[‘showDescription’] ) ?
     
        echo $args[‘before_widget’];
     
        $title = apply_filters( ‘widget_title’, $instance[‘title’] );
        if ( ! empty( $title ) ) {
            echo $args[‘before_title’] .
    </li>
    <li>
        <pre>require_once ‘php/autoloader.php’;
     
        // Instantiate and process this feed with all of the default options.
        $feed = new SimplePie();
     
        // Set which feed to process.
        $feed->set_feed_url( $feedURL );
     
        // Set where the cache files should be stored
        $feed->set_cache_location( plugin_dir_path( __FILE__ ) . ‘cache’ );
     
        // Run SimplePie.
        $feed->init();
     
        // ensure that the content is sent to the browser as text/html and the UTF-8 character set
        $feed->handle_content_type();
     
        // Figure out how many total items there are, but limit it to 5.
        $maxitems = $feed->get_item_quantity( $feedNumber );
     
        // Build an array of all the items, starting with element 0 (first element).
        $rss_items = $feed->get_items( 0, $maxitems );
     
    ?>
     
    <ul>
        <?php if ( $maxitems == 0 ) : ?>
        <li>
            <?php echo «No item found»;
        <?php else : ?>
            <?php // Loop through each feed item and display each item as a hyperlink.
            <?php foreach ( $rss_items as $item ) : ?>
                <li>
                    <a href=»<?php echo esc_url($item -> get_permalink()); ?>» title=»<?php echo esc_html( $item -> get_title() ); ?>»>
                        <?php echo esc_html( $item -> get_title() );
                    </a>
                    <?php if ( $showDate ) { echo «<span class=’date’>» .
                    <?php if ( $showDescription ) { echo «<div class=’description’>» .
                </li>
            <?php endforeach;
        <?php endif;
    </ul>
     
    <?php echo $args[‘after_widget’];
    }
  4. Создайте форму настроек виджета с помощью метода form()
    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
    34
    35
    public function form( $instance ) {
     
        $defaults = array(‘title’ => ‘Recent Posts’,
            ‘feedURL’ => get_site_url() .’/feed’,
            ‘feedNumber’ => 5
        );
        $instance = wp_parse_args( (array)$instance, $defaults );
        $title = $instance[‘title’];
        $feedURL = $instance[‘feedURL’];
        $feedNumber = $instance[‘feedNumber’];
        $showDate = $instance[‘showDate’];
        $showDescription = $instance[‘showDescription’];
    ?>
    <p>
        <label for=»<?php echo $this->get_field_id(‘title’); ?>»>Title:</label>
        <input class=»widefat» id=»<?php echo $this->get_field_id(‘title’); ?>» name=»<?php echo $this->get_field_name( ‘title’ ); ?>» type=»text» value=»<?php echo esc_attr( $title ); ?>»>
    </p>
    <p>
        <label for=»<?php echo $this->get_field_id(‘feedURL’); ?>»>Feed:</label>
        <input class=»widefat» id=»<?php echo $this->get_field_id(‘feedURL’); ?>» name=»<?php echo $thi->get_field_name( ‘feedURL’ ); ?>» type=»text» value=»<?php echo esc_attr( $feedURL ); ?>»>
    </p>
    <p>
        <label for=»<?php echo $this->get_field_id( ‘feedNumber’ ); ?>»>Number of posts to show:</label>
        <input id=»<?php echo $this->get_field_id( ‘feedNumber’ ); ?>» name=»<?php echo $this->get_field_name( ‘feedNumber’ ); ?>» size=»3″ type=»text» value=»<?php echo esc_attr( $feedNumber ); ?>»>
    </p>
    <p>
        <label for=»<?php echo $this->get_field_id( ‘showDate’ ); ?>»>Show Date?:</label>
        <input name=»<?php echo $this->get_field_name( ‘showDate’ ); ?>» value=»1″ type=»checkbox» <?php checked( $showDate, 1 );
    </p>
    <p>
        <label for=»<?php echo $this->get_field_id(‘showDescription’); ?>»>Show Summary?:</label>
        <input name=»<?php echo $this->get_field_name(‘showDescription’); ?>» value=»1″ type=»checkbox» <?php checked( $showDescription, 1 );
    </p>
    <?php
    }
  5. Наконец, метод update() очищает и сохраняет настройки виджета в базе данных.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    public function update( $new_instance, $old_instance ) {
         
        $instance = array();
        $instance[‘title’] = ( ! empty( $new_instance[‘title’] ) ) ?
        $instance[‘feedURL’] = ( ! empty( $new_instance[‘feedURL’] ) ) ?
        $instance[‘feedNumber’] = ( ! empty( $new_instance[‘feedNumber’] ) ) ?
        $instance[‘showDate’] = ( ! empty( $new_instance[‘showDate’] ) ) ?
        $instance[‘showDescription’] = ( ! empty( $new_instance[‘showDescription’] ) ) ?
     
        return $instance;
         
    }

Функция фида загрузки WordPress также получает фид и анализирует его, используя SimplePie. Если вы хотите использовать функцию fetch feed вместо реализации SimplePie с нуля, измените метод widget() в Tutsplus_simplepie виджетов Tutsplus_simplepie на приведенный ниже код.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public function widget( $args, $instance ) {
 
  $feedURL = empty( $instance[‘feedURL’] ) ?
  $feedNumber = (int) empty( $instance[‘feedNumber’] ) ?
  $showDate = empty( $instance[‘showDate’] ) ?
  $showDescription = empty( $instance[‘showDescription’] ) ?
 
  echo $args[‘before_widget’];
 
    $title = apply_filters( ‘widget_title’, $instance[‘title’] );
    if ( ! empty( $title ) )
        echo $args[‘before_title’] .
 
    include_once( ABSPATH . WPINC . ‘/feed.php’ );
 
    // Get a SimplePie feed object from the specified feed source.
    $rss = fetch_feed( $feedURL );
 
    if ( ! is_wp_error( $rss ) ) : // Checks that the object is created correctly
 
        // Figure out how many total items there are, but limit it to 5.
        $maxitems = $rss->get_item_quantity( $feedNumber );
 
        // Build an array of all the items, starting with element 0 (first element).
        $rss_items = $rss->get_items( 0, $maxitems );
 
    endif;
?>
 
<ul>
 <?php if ( $maxitems == 0 ) : ?>
    <li><?php echo «No item found»;
 <?php else : ?>
    <?php // Loop through each feed item and display each item as a hyperlink.
    <?php foreach ( $rss_items as $item ) : ?>
        <li>
            <a href=»<?php echo esc_url($item -> get_permalink()); ?>» title=»<?php echo esc_html($item->get_title()); ?>»>
                <?php echo esc_html($item->get_title());
            </a>
            <?php if ($showDate) { echo «<span class=’date’>» .
            <?php if ($showDescription) { echo «<div class=’description’>» .
        </li>
    <?php endforeach;
  <?php endif;
</ul>
 
<?php echo $args[‘after_widget’];
}
?>

Внешний вид виджета будет варьироваться от темы к теме в зависимости от вашей таблицы стилей. Некоторые из нас размещают наш фид на FeedBurner, поэтому я добавил поле опции URI фида в форму настроек виджета, если вы хотите изменить его, указав фид по умолчанию http://yoursite.com/feed .

Другие параметры виджета включают изменение номера «Недавнее сообщение» для отображения, отображение / скрытие сводки и даты каждого сообщения.

Форма настроек виджета "Последние сообщения"

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

После распаковки файл содержит два файла плагина в формате zip:

  1. Первый — это виджет, построенный с использованием SimplePie.
  2. Другая построена с использованием функции подачи WordPress, которая по совпадению также использует библиотеку SimplePie.

Надеюсь, это поможет в будущем работать с созданием виджетов и SimplePie.

Дайте мне знать ваши мысли в комментариях!