Intereting Posts
Расширенные пользовательские поля Поле изображения объекта Post не отображается в пользовательском типе сообщений single.php Проблема с Loop – хочу ограничить доступ к трем бесплатным статьям Получите результаты search.php в header.php? Модификация WooCommerce и WP SMS Боковая панель "Wrapper" Плагин / Виджет? Каковы хорошие подходы к маршрутизации некоторых URL-адресов во вторую установку WordPress? Могу ли я включить / отключить / скрыть плагины для каждого сайта на нескольких сайтах? Импорт сообщений с признаками Список тегов с обычным текстом? Пользовательский тип сообщения / вкладка Не удается вызвать файлы .php после переключения на% postname% Как я могу разрешить ошибку внутреннего сервера .htaccess, устанавливая многопользовательский WordPress? Недопустимые символы в URL-адресах Свяжите пользователей с настраиваемым типом сообщения Как создать настраиваемый шаблон публикации для определенной категории сообщений?

Виджет со случайными сообщениями из блога для внешних сайтов

Как создать настраиваемый виджет со случайными сообщениями из моего блога, которые могут быть опубликованы на другом сайте как js, iframe или div. Есть ли для этого плагин WordPress?

Solutions Collecting From Web of "Виджет со случайными сообщениями из блога для внешних сайтов"

Чтобы создать специальный вывод случайных сообщений:

  1. Зарегистрируйте конечную точку в корне вашего блога. Подробнее см. A (В основном) полное руководство по API перезаписи WordPress .
  2. Обновите настройки постоянной ссылки. Я бы сделал это только при активации (de).
  3. Подключитесь к 'template_redirect' и верните свой результат в зависимости от деталей запрашиваемой конечной точки. Затем exit .

Это все.

Ну … какой-то код может помочь понять детали. 🙂

Давайте построим небольшой плагин для вывода HTML и JSON.

Я назвал его T5 Random Posts Endpoint ; весь код переходит в класс со статическими методами, чтобы сохранить глобальное пространство имен в чистоте.

 add_action( 'init', array ( 'T5_Random_Posts_Endpoint', 'init' ) ); /** * Build a root endpoint. */ class T5_Random_Posts_Endpoint { /** * Register endpoint and actions. * * @wp-hook 'init' * @return void */ public static function init() { add_rewrite_endpoint( 'randomposts', EP_ROOT ); add_filter( 'request', array ( __CLASS__, 'filter_request' ) ); add_action( 'template_redirect', array ( __CLASS__, 'render' ) ); } } 

Как вы можете видеть, мы называем центральный метод init на 'init' чтобы … инициализировать наш плагин. Творческое именование, да?

Конечная точка называется randomposts и привязана к корню. Поэтому после активации вы можете получить свой код на example.com/randomposts/ или example.com/randomposts/json/ .

Но … если вы вызываете первый URL, то конечная точка работает, а randomposts переменной randomposts задается, но она пуста . Вот почему мы подключаемся к 'request' и присваиваем переменной значение по умолчанию, с которым мы можем работать позже. Давайте используем html по умолчанию:

  /** * Prepare the endpoint variable so it has always a value. * * @wp-hook 'request' * @param array $request * @return array */ public static function filter_request( $request ) { if ( isset ( $request['randomposts'] ) and empty ( $request['randomposts'] ) ) { $request['randomposts'] = 'html'; } return $request; } 

Теперь мы подключаемся к 'template_redirect' поэтому WordPress не будет использовать шаблон по умолчанию index.php но наш собственный вывод.

  /** * Create output. * * @wp-hook 'template_redirect' * @return void */ public static function render() { // This is not our endpoint. if ( '' === $type = get_query_var( 'randomposts' ) ) { return; } // Someone is poking around. // You can extend this and build different output variants. if ( ! in_array( $type, array ( 'html', 'json' ) ) ) { status_header( 414 ); print 'Unsupported Media Type. Use "html" or "json" only.'; exit; } // Empty blog? if ( ! $posts = get_posts( array ( 'numberposts' => 10, 'orderby' => 'rand' ) ) ) { status_header( 404 ); print 'No posts found.'; exit; } self::$type( self::prepare_post_data( $posts ) ); exit; } 

Сначала мы проверяем, действительно ли мы находимся на нашей конечной точке, просматривая get_query_var( 'randomposts' ) . Мы заполнили эту переменную в нашем фильтре запросов, поэтому, если она все еще пуста, мы точно знаем , что это не наш бизнес, и мы быстро возвращаемся.

Затем мы проверяем, был ли запрос для одного из наших предопределенных вариантов вывода html или json . Если кто-то вызывает /randomposts/css или /randomposts/lala мы /randomposts/lala ошибку 414 с полезным сообщением. И выйти.

Затем мы получим, наконец, наши сообщения с get_posts() и удалим все данные, которые нам не нужны, в специальном методе с именем prepare_post_data() :

  /** * Build a simple array with just titles and permalinks. * * @wp-hook 'template_redirect' * @param array $posts * @return void */ protected static function prepare_post_data( $posts ) { $data = array (); foreach ( $posts as $post ) { if ( empty ( $post->post_title) ) { continue; } $data[ $post->ID ] = array ( 'title' => strip_tags( $post->post_title ), 'url' => get_permalink( $post->ID ) ); } return $data; } 

Мы передаем этот простой массив методу, названному точно так же, как и наш вывод: html() или json() .
Начнем с json() ; это легкая часть. См. Раздел Как кодировать содержимое сообщения как JSON? для некоторого фона.

  /** * Render JSON output * * @wp-hook 'template_redirect' * @param array $data * @return void */ protected static function json( array $data ) { header( 'Content-type: application/json' ); print json_encode( $data ); } 

Легко, не так ли? html() не намного сложнее, просто дольше:

  /** * Render HTML output * * @wp-hook 'template_redirect' * @param array $data * @return void */ protected static function html( array $data ) { ?> <!doctype html> <title><?php bloginfo( 'name' ); ?></title> <meta name="viewport" content="width=device-width; initial-scale=1.0"> <?php // Just a sample style. Be creative! :) ?> <style> body, body * { display: block; font: 1em/1.4 Calibri, sans-serif; list-style: none; margin: 0; padding: 0; text-decoration: none; } a { background: #f5f5f5; border-bottom: 1px solid #ddd; color: #333; padding: 5px 10px; } a:hover, a:focus { background: #333; color: #f5f5f5; } h1 a { font-size: 1.2em; font-weight: bold; } </style> <h1><a href="<?php bloginfo( 'url' ); ?>"><?php bloginfo( 'name' ); ?></a></h1> <ul> <?php foreach ( $data as $post ) { print '<li><a href="' . $post['url'] . '">' . $post['title'] . '</a></li>'; } ?> </ul> <?php } 

Вот как это выглядит с данными теста темы :

введите описание изображения здесь

Теперь наш выход завершен – мы все еще находимся в render() – и мы вызываем exit потому что иначе WordPress будет включать index.php из активной темы.

Теперь нам нужен только способ обновления настроек постоянной ссылки:

  /** * Reset permalinks. * * @wp-hook 'activate_' . __FILE__ * @wp-hook 'deactivate_' . __FILE__ * @return void */ public static function flush_rewrite_rules() { remove_action( 'init', array ( __CLASS__, 'init' ) ); add_action( 'init', 'flush_rewrite_rules', 11 ); } 

Мы предотвращаем наш init hook здесь, потому что при активации мы находимся в списке плагинов, где нам не нужна конечная точка, и при деактивации мы не хотим перерегистрировать текущую неизменную ссылку.

Мы присоединяем этот метод к (де) активации с помощью:

 // refresh permalink settings register_activation_hook( __FILE__ , array ( 'T5_Random_Posts_Endpoint', 'flush_rewrite_rules' ) ); register_deactivation_hook( __FILE__ , array ( 'T5_Random_Posts_Endpoint', 'flush_rewrite_rules' ) ); 

И теперь мы можем сказать: вот и все. В самом деле.

Если вы сделали это, хватайте полный плагин от GitHub .

Я думаю, по сути, что вы говорите, это пользовательский виджет, который будет анализировать и отображать RSS-канал вашего блога. Здесь вы можете создать собственный виджет собственного и жестко закодировать URL-адрес RSS-ленты своего блога в своем самом PHP-виджете, чтобы убедиться, что пользователь Widget не изменил URL-адрес; поэтому ваш виджет покажет только RSS вашего блога.

Теперь, как только вы закончите использовать RSS для разблокировки своего блога, перед вами откроется несколько вариантов. Либо вы можете использовать собственные возможности RSS-ленты WordPress, чтобы сэкономить ваше время (но это наложит много ограничений), либо напишите свой собственный код создателя RSS-ленты, поскольку веб-служба, установленная на вашем сервере / веб-хостинге, будет взаимодействовать с вашим виджетами. Итак, сделайте свой Widget PHP для отправки запроса на веб-службу публикации RSS-канала вашего блога; затем проанализируйте результаты, возвращаемые вашим сервером, и отобразите элементы RSS-фида.

Если у вас есть время инвестировать и серьезно относиться к этому виджету, то лучше реализовать свой собственный веб-сервис. Я не думаю, что это будет слишком сложно для вас … просто играйте с WP_Query и верните результаты в правильном формате XML-фида RSS. Таким образом, вы также сможете предлагать список категорий в раскрывающемся списке для своего пользователя-виджета на свой выбор и сделать свой Widget PHP запросом RSS сообщений только из выбранной категории вашего блога. Кроме того, вам будет лучше контролировать, сколько сообщений нужно возвращать в RSS-фиде, запрошенном вашим виджетами.

Надеюсь, это поможет.

Ура,

Ruturaaj.