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 }
Результат прекрасно видно на рисунке справа. Естественно, провайдер поиска ещё не работает :-). Но 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 }
Результат очевиден, а страница опций выглядит так, как показано на рисунке справа. Что касается заголовка, мы сделали всё, что требуется. Теперь пришло время подготовить файл opensearch.xml.
Продолжение следует
В следующих статьях продолжим разработку нашего плагина, сформируем сам opensearch.xml файл, добавим опциональный вывод необходимых тегов в RSS и Atom потоки для интеграции визуального поиска и в них.
RSS комментарии
Обратная ссылка