Intereting Posts
Указанное количество столбчатых сообщений, которые не отображаются правильно Установить cookie с именем таксономии Как обновить почтовую мета по клику? Перенаправление после изменения пароля пользователя Почтовые ящики WordPress В закладках и скрытых зарегистрированных страницах Как получить сообщение, которое имеет ненулевое или большее ноль мета значение Шаблон предварительного просмотра страницы / страницы Исключить идентификатор сообщения из массива, заданного в пользовательском поле Защищать изменения, внесенные в тему при обновлении Проблема с поисковым URL Как сделать WordPress более эффективным с точки зрения памяти? Подписчики на сообщения Отдельная страница «Виджеты» для каждого языка Частная почта, скрытая от администратора тоже Сообщения CPT в раскрывающемся списке в мета-окне на странице не возвращают идентификатор сообщения

Backbone.js и WP API

Я создаю тему, основанную на теме подчеркивания с интеграцией Backbone.js . Я изо всех сил пытаюсь найти какие-либо четкие примеры / документацию по возможностям плагина WP-API и начинаю считать это довольно расстраивающим.

Я занимаюсь основным списком сообщений, используя следующий код:

var posts = new wp.api.collections.Posts(), posts.fetch(options).done(function(){ console.log( 'we now have 10 posts'); } 

Это прекрасно работает. Проблема заключается в том, что я хочу получить некоторую post_meta одновременно, без асинхронного вызова нескольких выборок (по одному на сообщение). Есть некоторые поля post_meta, которые я хочу использовать, а также получение миниатюры сообщений.

Любое направление приветствуется.

До сих пор я не использовал плагин WP-API / JSON REST, но это то, что я могу видеть в источнике: кажется, что ~/js/models.js является точкой входа для всех запросов. И каждый из wp.api.models (чтобы назвать несколько: Page , Post , Media , Revision и т. Д.) – это просто расширение Backbone.Model .

И, глядя в фактическую модель Post , я вижу, что, похоже, есть способ получить и метаданные post:

  defaults: function() { return { ID: null, title: '', status: 'draft', type: 'post', author: new wp.api.models.User(), content: '', link: '', 'parent': 0, date: new Date(), date_gmt: new Date(), modified: new Date(), modified_gmt: new Date(), format: 'standard', slug: '', guid: '', excerpt: '', menu_order: 0, comment_status: 'open', ping_status: 'open', sticky: false, date_tz: 'Etc/UTC', modified_tz: 'Etc/UTC', terms: {}, post_meta: {}, // <---- USE THIS OBJECT meta: { links: {} } }; }, 

Ссылка на источник

Я не знаю, какое точное определение объекта вы использовали для

 posts.fetch( options ) 

но вы должны { post_meta : {} } .


Чтобы (возможно) отладить то, к чему у вас есть доступ, вы можете сбросить arguments в обратном вызове, прикрепленном к

 var beforeSend = options.beforeSend; 

который проходит, разумеется, до того, как будет запущен фактический запрос. «Возможно» возникло из-за того, что я сначала смотрел ветку gh-pages на случай аварии. Там нигде не указано, какая ветка используется для чего, поэтому я предполагаю, что master – это ветка разработки и доставки (но кто знает) и выше, возможно, в этом случае не будет работать.

Внутри PHP-стороны есть фильтр json_prepare_post , который позволяет вам изменять возвращаемый объект Post . Здесь вы можете приложить метаданные и другие вещи, такие как миниатюры сообщений.

 add_filter( 'json_prepare_post', 'eh_json_prepare_post' ); function eh_json_prepare_post( $_post ) { $_post['post_meta']['some-value'] = get_post_meta( $_post['ID'], 'some-value', true ); return $_post; } 

Когда я использую API сообщений, он получает информацию, включающую мета автоматически, и вы должны посмотреть, что возвращается с помощью консоли Rest или аналогично, чтобы увидеть, что нужно удалить. Кроме того, здесь есть хороший ответ, который показывает, как это сделать.

Если у вас собственный тип сообщений, это не то же самое! Для этого вам нужно создать специальный обработчик.

В файле страниц есть пример (class-wp-json-pages.php)

 <?php /** * Page post type handlers * * @package WordPress * @subpackage JSON API */ /** * Page post type handlers * * This class serves as a small addition on top of the basic post handlers to * add small functionality on top of the existing API. * * In addition, this class serves as a sample implementation of building on top * of the existing APIs for custom post types. * * @package WordPress * @subpackage JSON API */ class WP_JSON_Pages extends WP_JSON_CustomPostType { /** * Base route * * @var string */ protected $base = '/pages'; /** * Post type * * @var string */ protected $type = 'page'; /** * Register the page-related routes * * @param array $routes Existing routes * @return array Modified routes */ public function register_routes( $routes ) { $routes = parent::register_routes( $routes ); $routes = parent::register_revision_routes( $routes ); $routes = parent::register_comment_routes( $routes ); // Add post-by-path routes $routes[ $this->base . '/(?P<path>.+)'] = array( array( array( $this, 'get_post_by_path' ), WP_JSON_Server::READABLE ), array( array( $this, 'edit_post_by_path' ), WP_JSON_Server::EDITABLE | WP_JSON_Server::ACCEPT_JSON ), array( array( $this, 'delete_post_by_path' ), WP_JSON_Server::DELETABLE ), ); return $routes; } /** * Retrieve a page by path name * * @param string $path * @param string $context * * @return array|WP_Error */ public function get_post_by_path( $path, $context = 'view' ) { $post = get_page_by_path( $path, ARRAY_A ); if ( empty( $post ) ) { return new WP_Error( 'json_post_invalid_id', __( 'Invalid post ID.' ), array( 'status' => 404 ) ); } return $this->get_post( $post['ID'], $context ); } /** * Edit a page by path name * * @param $path * @param $data * @param array $_headers * * @return true|WP_Error */ public function edit_post_by_path( $path, $data, $_headers = array() ) { $post = get_page_by_path( $path, ARRAY_A ); if ( empty( $post ) ) { return new WP_Error( 'json_post_invalid_id', __( 'Invalid post ID.' ), array( 'status' => 404 ) ); } return $this->edit_post( $post['ID'], $data, $_headers ); } /** * Delete a page by path name * * @param $path * @param bool $force * * @return true|WP_Error */ public function delete_post_by_path( $path, $force = false ) { $post = get_page_by_path( $path, ARRAY_A ); if ( empty( $post ) ) { return new WP_Error( 'json_post_invalid_id', __( 'Invalid post ID.' ), array( 'status' => 404 ) ); } return $this->delete_post( $post['ID'], $force ); } /** * Prepare post data * * @param array $post The unprepared post data * @param string $context The context for the prepared post. (view|view-revision|edit|embed|single-parent) * @return array The prepared post data */ protected function prepare_post( $post, $context = 'view' ) { $_post = parent::prepare_post( $post, $context ); // Override entity meta keys with the correct links $_post['meta']['links']['self'] = json_url( $this->base . '/' . get_page_uri( $post['ID'] ) ); if ( ! empty( $post['post_parent'] ) ) { $_post['meta']['links']['up'] = json_url( $this->base . '/' . get_page_uri( (int) $post['post_parent'] ) ); } return apply_filters( 'json_prepare_page', $_post, $post, $context ); } } с <?php /** * Page post type handlers * * @package WordPress * @subpackage JSON API */ /** * Page post type handlers * * This class serves as a small addition on top of the basic post handlers to * add small functionality on top of the existing API. * * In addition, this class serves as a sample implementation of building on top * of the existing APIs for custom post types. * * @package WordPress * @subpackage JSON API */ class WP_JSON_Pages extends WP_JSON_CustomPostType { /** * Base route * * @var string */ protected $base = '/pages'; /** * Post type * * @var string */ protected $type = 'page'; /** * Register the page-related routes * * @param array $routes Existing routes * @return array Modified routes */ public function register_routes( $routes ) { $routes = parent::register_routes( $routes ); $routes = parent::register_revision_routes( $routes ); $routes = parent::register_comment_routes( $routes ); // Add post-by-path routes $routes[ $this->base . '/(?P<path>.+)'] = array( array( array( $this, 'get_post_by_path' ), WP_JSON_Server::READABLE ), array( array( $this, 'edit_post_by_path' ), WP_JSON_Server::EDITABLE | WP_JSON_Server::ACCEPT_JSON ), array( array( $this, 'delete_post_by_path' ), WP_JSON_Server::DELETABLE ), ); return $routes; } /** * Retrieve a page by path name * * @param string $path * @param string $context * * @return array|WP_Error */ public function get_post_by_path( $path, $context = 'view' ) { $post = get_page_by_path( $path, ARRAY_A ); if ( empty( $post ) ) { return new WP_Error( 'json_post_invalid_id', __( 'Invalid post ID.' ), array( 'status' => 404 ) ); } return $this->get_post( $post['ID'], $context ); } /** * Edit a page by path name * * @param $path * @param $data * @param array $_headers * * @return true|WP_Error */ public function edit_post_by_path( $path, $data, $_headers = array() ) { $post = get_page_by_path( $path, ARRAY_A ); if ( empty( $post ) ) { return new WP_Error( 'json_post_invalid_id', __( 'Invalid post ID.' ), array( 'status' => 404 ) ); } return $this->edit_post( $post['ID'], $data, $_headers ); } /** * Delete a page by path name * * @param $path * @param bool $force * * @return true|WP_Error */ public function delete_post_by_path( $path, $force = false ) { $post = get_page_by_path( $path, ARRAY_A ); if ( empty( $post ) ) { return new WP_Error( 'json_post_invalid_id', __( 'Invalid post ID.' ), array( 'status' => 404 ) ); } return $this->delete_post( $post['ID'], $force ); } /** * Prepare post data * * @param array $post The unprepared post data * @param string $context The context for the prepared post. (view|view-revision|edit|embed|single-parent) * @return array The prepared post data */ protected function prepare_post( $post, $context = 'view' ) { $_post = parent::prepare_post( $post, $context ); // Override entity meta keys with the correct links $_post['meta']['links']['self'] = json_url( $this->base . '/' . get_page_uri( $post['ID'] ) ); if ( ! empty( $post['post_parent'] ) ) { $_post['meta']['links']['up'] = json_url( $this->base . '/' . get_page_uri( (int) $post['post_parent'] ) ); } return apply_filters( 'json_prepare_page', $_post, $post, $context ); } } 

Замените «Страницы» на «MyCustomPostTypes» и на странице «mycustomposttype». Просто будьте осторожны, чтобы не переименовать внутренний код WordPress, который также использует термин

Примечание: возможно, лучше всего добавить это как плагин, а не изменить плагин JSON-WP-API

 /** * Plugin Name: MyCustom JSON App API * Description: MyCustomPost handler for the JSON API * Dependency: This plugin requires JSON-WP-API Plugin!!!! * Author: * Author URI: * Version: * Plugin URI: */