Статья размещена автором Бетке Сергей Сергеевич

WordPress плагин: Search Provider для IE (и не только), часть 3 – пишем opensearch.xml

Продолжим создание собственного плагина под WordPress 3.0: обеспечим поддержку механизма “Search Provider Extensibility”. Продолжим.

Описание opensearch.xml и его схемы читаем здесь и на MSDN. Сначала “руками” создадим необходимый нам opensearch.xml файл, и только после этого будем вносить необходимый функционал в наш плагин. Нам предстоит “создать” что-то типа этого:

<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription
  xmlns="http://a9.com/-/spec/opensearch/1.1/"
  xmlns:ie="http://schemas.microsoft.com/Search/2008/"
  xmlns:referrer="http://a9.com/-/opensearch/extensions/referrer/1.0/"
>
   <InputEncoding>UTF-8</InputEncoding>
   <OutputEncoding>UTF-8</OutputEncoding>
   <Language>ru-ru</Language>

   <ShortName>Блог Бетке С.С.</ShortName>
   <LongName>IT блог Бетке Сергея Сергеевича</LongName>
   <Description>Поиск по IT блогу Бетке Сергея Сергеевича.</Description>
   <Tags>IT блог, Бетке, powershell, wordpress, WSH, Windows</Tags>
   <Image height="64" width="64" type="image/png">

http://example.com/websearch.png</Image>

   <Image height="16" width="16" type="image/vnd.microsoft.icon">

http://sergey-s-betke.blogs.novgaro.ru/favicon.ico</Image>

   <AdultContent>false</AdultContent>
   <SyndicationRight>open</SyndicationRight>

   <Url type="application/opensearchdescription+xml"
     rel="self"
     template="http://sergey-s-betke.blogs.novgaro.ru/opensearch.xml" />
   <Url type="application/atom+xml"
     template="http://example.com/?q={searchTerms}&amp;pw={startPage?}&amp;format=atom"/>
   <Url type="application/rss+xml"
     template="http://example.com/?q={searchTerms}&amp;pw={startPage?}&amp;format=rss"/>
   <Url type="text/html" 
     template="http://example.com/?q={searchTerms}&amp;pw={startPage?}"/>
   <Url type="application/x-suggestions+json"
     template="http://suggestions.example.com/search.aspx?q={searchTerms}"/>
   <Url type="application/x-suggestions+xml"
     template="http://suggestions.example.com/search.aspx?q={searchTerms}"/>
   <ie:PreviewUrl type="text/html"
     template="http://suggestions.example.com/search.aspx?q={searchTerms}"/>

   <Query role="example" searchTerms="cat" />

   <Contact>sergey.s.betke@novgaro.ru</Contact>
   <Developer>Sergey S. Betke</Developer>
   <Attribution>
     Search data Copyright 2010,
     Sergey S. Betke
   </Attribution>
</OpenSearchDescription>

Решил не сохранять файл из консоли, а создавать его контент “на лету” по GET запросу. Сделаем:

   public static function init() {
      ...
      if ($_SERVER["REQUEST_URI"] == self::$options['file_url'])
         self::get_opensearch_xml();
      ...
   }
   
   public static function validate_options($options) {
      if (!is_array($options)) {
         $options = array();
      }

      if ($options['title'] == '')               
         $options['title'] = get_bloginfo('name');
      $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'] = '/opensearch.xml';
  
      return $options;
   }

   protected static function get_full_file_url($file_url) {
      if (!$file_url)
         $file_url = '/opensearch.xml';
      return home_url($file_url);
   }
   
   public static function get_opensearch_xml() {
      header('Content-type: text/xml; charset=' . get_bloginfo('charset'), true);
      echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . '"?' . '>';
      ?>

<OpenSearchDescription
  xmlns="http://a9.com/-/spec/opensearch/1.1/"
  xmlns:ie="http://schemas.microsoft.com/Search/2008/"
  xmlns:referrer="http://a9.com/-/opensearch/extensions/referrer/1.0/"
>
   <InputEncoding><?php echo get_bloginfo('charset'); ?></InputEncoding>
   <OutputEncoding><?php echo get_bloginfo('charset'); ?></OutputEncoding>
   <Language><?php echo str_replace('_', '-', get_bloginfo('language')); ?></Language>

   <ShortName><?php echo self::$options['title']; ?></ShortName>
   <LongName>--<?php echo self::$options['title']; ?></LongName>
   <Description><?php echo get_bloginfo('description') ?></Description>
   <Tags>--IT блог, Бетке, powershell, wordpress, WSH, Windows</Tags>
   <Image height="64" width="64" type="image/png">
     --http://example.com/websearch.png</Image>
   <Image height="16" width="16" type="image/vnd.microsoft.icon">
     +-<?php echo home_url('favicon.ico'); ?></Image>

   <AdultContent>--false</AdultContent>
   <SyndicationRight>--open</SyndicationRight>

   <Url type="application/opensearchdescription+xml"
     rel="self"
     template="<?php echo self::get_full_file_url(self::$options['file_url']); ?>" />
   <Url type="application/atom+xml"
     template="--http://example.com/?q={searchTerms}&amp;pw={startPage?}&amp;format=atom"/>
   <Url type="application/rss+xml"
     template="--http://example.com/?q={searchTerms}&amp;pw={startPage?}&amp;format=rss"/>
   <Url type="text/html" 
     template="--http://example.com/?q={searchTerms}&amp;pw={startPage?}"/>
   <Url type="application/x-suggestions+json"
     template="--http://suggestions.example.com/search.aspx?q={searchTerms}"/>
   <Url type="application/x-suggestions+xml"
     template="--http://suggestions.example.com/search.aspx?q={searchTerms}"/>
   <ie:PreviewUrl type="text/html"
     template="--http://suggestions.example.com/search.aspx?q={searchTerms}"/>

   <Query role="--example" searchTerms="cat" />

   <Contact><?php echo get_bloginfo('admin_email') ?></Contact>
   <Developer><?php echo get_bloginfo('admin_email') ?></Developer>
   <Attribution>
     --Search data Copyright 2010,
     Sergey S. Betke
   </Attribution>
</OpenSearchDescription>
      <?php
      die();
   }

Ничего более красивого пока не нашёл. Пришлось на событие init анализировать URI метода GET, формировать заголовок, после чего “убивать” wordpress. Пока закончил только первый этап, ещё далеко не все элементы файла имеют необходимые значения. И пока что мой анализ URI не поддерживает случая установки wordpress не в корневой каталог сайта. Исправим в ближайшее время и эти недочёты.

P.S. В дальнейшем нам предстоит добавить ссылку для регистрации нашего провайдера визуального поиска в браузере пользователя. Что-то типа следующего нам предстоит интегрировать в страницу:

<a href="#"
   onclick="window.external.AddSearchProvider('http://www.example.com/provider.xml')"
   >Add Search Provider Example</a>

Дополнительная информация:

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

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

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