Продолжим кодирование плагина “Cos Search Provider” (реализация  Search Provider Extensibility под WordPress). На этом этапе по аналогии с HEAD добавим заголовки (анонсируем поддержку Search Provider Extensibility) и в RSS, и в ATOM. Естественно – опционально.

Как нам указывают в спецификации на OpenSearch, публикация описателя сервиса поиска возможна и целесообразна и в RSS потоке, и в ATOM потоке. Пример нам приводят следующий:

<?xml version="1.0" encoding="UTF-8"?>
 <feed xmlns="http://www.w3.org/2005/Atom" 
       xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">
   <!-- ... --->
   <link rel="search"
         href="http://example.com/opensearchdescription.xml" 
         type="application/opensearchdescription+xml" 
         title="Content Search" />
   <!-- ... --->
 </feed>

Другими словами, нам предстоит вывести строго тот же самый тег LINK, что мы выводим и в HEAD страницы. Попробуем реализовать. И помогут нам в этом следующие события WordPress (Action Reference): atom_head и atom_ns, rss2_ns, rss2_head, rss_head.

Добавлять namespace atom в RSS поток нет необходимости – WordPress его уже добавил. Поэтому для RSS только выводим саму ссылку, а для atom потока – добавляем namespace.

   public static function init() {
      ...
      add_action('atom_ns',    array(__CLASS__, 'feed_ns_opensearch'));
      add_action('atom_head',  array(__CLASS__, 'wp_head'           ));
      add_action('rss2_head',  array(__CLASS__, 'rss_head'          ));
      add_action('rss_head',   array(__CLASS__, 'rss_head'          ));
   }
   
   public static function wp_head() {
      ?>
<link
    title="<?php echo self::$options['title']; ?>"
    rel="search"
    type="application/opensearchdescription+xml"
    href="<?php echo self::$options['file_url']; ?>"
/>
      <?php
   }
   
   public static function rss_head() {
      ?>
<atom:link
    title="<?php echo self::$options['title']; ?>"
    rel="search"
    type="application/opensearchdescription+xml"
    href="<?php echo self::$options['file_url']; ?>"
/>
      <?php
   }
   
   public static function feed_ns_opensearch() {
      echo ' xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"';
   }

Задача выполнена. Осталось подписку на события сделать опциональной и предоставить пользователю интерфейс для управления этими опциями – и всё. Дорабатываем интерфейс консоли управления:

   public static function init() {
      ...
      if (self::$options['link_on_atom']) {
         add_action('atom_ns',    array(__CLASS__, 'feed_ns_opensearch'));
         add_action('atom_head',  array(__CLASS__, 'wp_head'           ));
      };
      if (self::$options['link_on_rss']) {
         add_action('rss2_head',  array(__CLASS__, 'rss_head'          ));
         add_action('rss_head',   array(__CLASS__, 'rss_head'          ));
      };
   }
   
   public static function admin_init() {
      ...
      add_settings_field(
         self::$_namespace . '_options[link_on_rss]',
         __('LINK in RSS feed', self::$_domain),
         array(__CLASS__, 'option_control_link_on_rss'),
         self::$_namespace . '_options_page',
         self::$_namespace . '_main_options'
      );
      add_settings_field(
         self::$_namespace . '_options[link_on_atom]',
         __('LINK in ATOM feed', self::$_domain),
         array(__CLASS__, 'option_control_link_on_atom'),
         self::$_namespace . '_options_page',
         self::$_namespace . '_main_options'
      );
      ...
   }

   public static function option_control_link_on_rss() {
     ?>
        <label>
           <input
              type="checkbox"
              name="<?php echo self::$_namespace . '_options[link_on_rss]' ?>"
     <?php if (self::$options['link_on_rss']) { ?> 
              checked="checked" 
     <?php } ?> 
           />
           <?php _e('Insert LINK tag in the feed header', self::$_domain) ?>
        </label>
     <?php      
   }
   
   public static function option_control_link_on_atom() {
     ?>
        <label>
           <input
              type="checkbox"
              name="<?php echo self::$_namespace . '_options[link_on_atom]' ?>"
     <?php if (self::$options['link_on_atom']) { ?> 
              checked="checked" 
     <?php } ?> 
           />
           <?php _e('Insert LINK tag in the feed header', self::$_domain) ?>
        </label>
     <?php      
   }
   
   public static function validate_options($options) {
      if (!is_array($options)) {
         $options = array();
      }

      if ($options['title'] == '')               
         $options['title'] = get_bloginfo('name');
      if ($options['link_on_all_pages'] == '')
         $options['link_on_all_pages'] = 'checked';
      $options['link_on_rss'] = ($options['link_on_rss'] == 'checked') || ($options['link_on_rss'] == TRUE);
      $options['link_on_atom'] = ($options['link_on_atom'] == 'checked') || ($options['link_on_atom'] == TRUE);
      if ($options['location_mode'] == '')
         $options['location_mode'] = 'auto';
      if (($options['file_url'] == '') || ($options['location_mode'] == 'auto'))
         $options['file_url'] = trailingslashit(get_bloginfo('url')) . 'opensearch.xml';
      if (($options['file_name'] == '') || ($options['location_mode'] == 'auto'))
         $options['file_name'] = get_home_path() . 'opensearch.xml';
  
      return $options;
   }

WordPress плагин: Search Provider для IE (и не только), часть 2 – дописываем заголовки в RSS и ATOM И интерфейс консоли управления уже также доработан.

В следующей статье рассмотрим opensearch.xml файл, его спецификацию, и попробуем его сформировать из консоли управления.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка