WordPress плагин: Search Provider для IE (и не только), часть 2 – дописываем заголовки в RSS и ATOM
Продолжим кодирование плагина “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; }
И интерфейс консоли управления уже также доработан.
В следующей статье рассмотрим opensearch.xml файл, его спецификацию, и попробуем его сформировать из консоли управления.
RSS комментарии
Обратная ссылка