Backbone.js and WP API

时间:2014-11-05 作者:Eric Holmes

我正在根据underscore theme with Backbone.js integration. 我正在努力寻找任何关于WP-API插件功能的清晰示例/文档,并开始发现它相当令人沮丧。

我正在使用以下代码获取基本的帖子列表:

var posts = new wp.api.collections.Posts(),
posts.fetch(options).done(function(){
    console.log( \'we now have 10 posts\');
}
这很好用。问题是我希望同时检索一些post\\u meta,而不需要异步进行多个fetch调用(每个post一个)。我希望使用一些post\\u元字段,以及获取帖子缩略图。

欢迎任何指示。

4 个回复
最合适的回答,由SO网友:Eric Holmes 整理而成

在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;
}

SO网友:kaiser

到目前为止,我还没有使用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: {}
            }
        };
    },
Link to Source

我不知道你用的是什么确切的对象定义

posts.fetch( options )
但你应该给{ post_meta : {} } 一次尝试。

要(可能)调试您有权访问的内容,您可以转储arguments 在附加到的回调中

var beforeSend = options.beforeSend;
当然,它会在实际请求被激发之前运行。“可能”一词的由来是我第一次看到gh-pages 每次事故的分支。没有明确说明哪个分支用于什么,所以我假设master 在这种情况下,开发和运输部门(但谁知道)及以上部门是否可能不起作用。

SO网友:brianlmerritt

当我使用posts API时,它会自动获取包含meta的信息,您应该查看使用Rest控制台或类似工具返回的内容,以查看应该删除的内容。此外,这里已经有一个很好的答案,说明了如何做到这一点。

如果你有一个自定义的帖子类型,那就不一样了!您需要为此创建一个特殊的处理程序。

页面文件中有一个示例(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 );
    }
}
将“页面”替换为“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: 
 */

SO网友:Aurovrata

在API的v2中,现在有一个钩子可以向对象的响应添加其他字段,您需要使用register_rest_field() function,

add_action( \'rest_api_init\', \'create_api_posts_meta_field\' ); 
function create_api_posts_meta_field() {
    register_rest_field( array(\'post\',\'page\'), \'language-menu\', array(
           \'get_callback\'    => \'get_custom_field_for_api\',
           \'schema\'          => null,
        )
    );
}
function get_custom_field_for_api($object){
    return get_post_meta( $object[\'id\'], \'some-value\', true );
}

结束

相关推荐

自定义3.5版“添加媒体”弹出窗口(Backbone.js)

这里还有一个关于新(ish)3.5“添加媒体”弹出窗口的问题,以及如何自定义它!What I\'m trying to do我正在尝试做四件主要的事情:1)创建一个名为“Flickr上传”的自定义选项卡;2) 自定义上载中显示的文本button; 3) 填充select 外部下拉菜单API 排序选项(换句话说unset 默认选项和set 我自己的。。。仅适用于自定义选项卡);4) 将显示的照片更改为外部API 还可以添加标签、描述等。。。在右侧栏中。What I\'ve managed to do使用gi