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

WordPress плагин: Search Provider для IE (и не только), часть 1 – правим HEAD блога

Пришла в голову идея создания собственного плагина под WordPress 3.0: обеспечим поддержку механизма “Search Provider Extensibility”. Другими словами, хочу плагин, который даст возможность мне и моим читателям установить в своём Internet Explorer или Mozilla провайдер поиска непосредственно по моему блогу, используя в дальнейшем и возможности визуального поиска. Приступим.

Введение

Данная статья открывает рубрику “IE Search Provider” в моём блоге. В указанной рубрике я планирую публиковать статьи о новых версиях, изменениях и так далее указанного плагина. Если Вас интересует последняя версия плагина, либо Вы хотите задать вопросы по конкретной версии – прочитайте статью о интересующей Вас версии.

В данной статье я не планирую рассматривать по шагам механизм создания плагина, только функционал непосредственно обсуждаемого плагина и его реализацию. Механизм создания плагина осветил и продолжаю в рубрике “Пишем плагин”.

Правим HEAD

Итак, к сути: Visual search provider for IE8 (доклад на TechDays на эту тему). На первом этапе добавим в заголовок страниц блога (не в консоль управления) тег LINK:

<link
    title="IT блог Бетке Сергея"
    rel="search"
    type="application/opensearchdescription+xml"
    href="/opensearch.xml"
/>

Добавим необходимый код в плагин:

   public static function plugins_loaded() {
      ...
      add_action('init', array(__CLASS__, 'init'));
   }
   
   public static function init() {
      ...
      add_action('wp_head', array(__CLASS__, 'wp_head'));
   }
   
   public static function wp_head() {
      ?>
<link
    title="<?php echo self::$options['title']; ?>"
    rel="search"
    type="application/opensearchdescription+xml"
    href="/opensearch.xml"
/>
      <?php
   }

WordPress плагин: Search Provider для IE (и не только), часть 1 – правим HEAD блога Результат прекрасно видно на рисунке справа. Естественно, провайдер поиска ещё не работает :-). Но Internet Explorer его уже нашёл.

Предоставляем возможность переместить opensearch.xml

Теперь поработаем над тем, чтобы местоположение и именование описания провайдера (opensearch.xml) могли быть изменены. Добавим соответствующие опции к плагину и воспользуемся ими при формировании тега LINK.

   public static function admin_init() {
      register_setting(
         self::$_namespace,
         self::$_namespace . '_options',
         array(__CLASS__, 'validate_options')
      );

      add_settings_section(
         self::$_namespace . '_main_options',
         __('Main Settings', self::$_domain),
         false,
         self::$_namespace . '_options_page'
      );
      add_settings_field(
         self::$_namespace . '_options[title]',
         __('Title', self::$_domain),
         array(__CLASS__, 'option_control_title'),
         self::$_namespace . '_options_page',
         self::$_namespace . '_main_options'
      );

      add_settings_section(
         self::$_namespace . '_location_options',
         __('Location of your opensearch.xml file', self::$_domain),
         array(__CLASS__, 'section_location_description'),
         self::$_namespace . '_options_page'
      );
      add_settings_field(
         self::$_namespace . '_options[location_mode]',
         __('OpenSearch.xml location mode', self::$_domain),
         array(__CLASS__, 'option_control_location_mode'),
         self::$_namespace . '_options_page',
         self::$_namespace . '_location_options'
      );
   }

   public static function option_control_title() {
      ?>      
          <input
            name="<?php echo self::$_namespace . '_options[title]' ?>"
            type="text"
            size="50"
            style="width: 100%"
            value="<?php echo self::$options['title']; ?>"
          />
      <?php      
   }
   
   public static function section_location_description() {
      ?>      
          <p><?php _e('You can select location of your opensearch.xml file and his url, or leave automatic detection.', self::$_domain); ?></p>
      <?php      
   }
   
   public static function option_control_location_mode() {
     ?>
       <div>
          <label>
             <input
                type="radio"
                name="<?php echo self::$_namespace . '_options[location_mode]' ?>"
                value="auto"
     <?php if (self::$options['location_mode'] == "auto") { ?> 
                checked="checked" 
     <?php } ?> 
             />
             <?php _e('Automatic detection', self::$_domain) ?>
          </label>
          <ul>
             <li>
                <?php _e('Detected Path', self::$_domain) ?>: 
                   <?php echo get_home_path() . 'opensearch.xml'; ?>
                   <br />
                <?php _e('Detected URL', self::$_domain) ?>: 
                   <a href="<?php echo trailingslashit(get_bloginfo('url')) . 'opensearch.xml'; ?>">
                      <?php echo trailingslashit(get_bloginfo('url')) . 'opensearch.xml'; ?>
                   </a>
             </li>
          </ul>
       </div>
       <div>
          <label>
             <input
                type="radio"
                name="<?php echo self::$_namespace . '_options[location_mode]' ?>"
                value="manual"
     <?php if (self::$options['location_mode'] != "auto") { ?> 
                checked="checked" 
     <?php } ?> 
             />
             <?php _e('Custom location', self::$_domain) ?>
          </label>
          <ul>
             <li>
                <label>
                   <?php _e('Absolute or relative path to the opensearch.xml file, including name.', self::$_domain); ?><br />
                   <?php _e('Example', self::$_domain); echo ": /var/www/htdocs/wordpress/opensearch.xml"; ?><br />
                   <input
                      type="text"
                      style="width:100%"
                      name="<?php echo self::$_namespace . '_options[file_name]' ?>"
                      value="<?php echo self::$options['file_name']; ?>"
                   />
                </label>
             </li>
             <li>
                <label>
                   <?php _e('Complete URL to the sitemap file, including name.', self::$_domain); ?><br />
                   <?php _e('Example', self::$_domain); echo ": http://www.yourdomain.com/sitemap.xml"; ?><br />
                   <input
                      style="width:100%"
                      type="text"
                      name="<?php echo self::$_namespace . '_options[file_url]' ?>"
                      value="<?php echo self::$options['file_url']; ?>"
                   />
                </label>
             </li>
          </ul>
       </div>
     <?php      
   }
   
   public static function validate_options($options) {
      if (!is_array($options)) {
         $options = array();
      }

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

WordPress плагин: Search Provider для IE (и не только), часть 1 – правим HEAD блога Результат очевиден, а страница опций выглядит так, как показано на рисунке справа. Что касается заголовка, мы сделали всё, что требуется. Теперь пришло время подготовить файл opensearch.xml.

Продолжение следует

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

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

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

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