取消设置自定义POST类型WordPress API(wp-json)中的数据

时间:2015-09-10 作者:RMH

我已经可以在WordPress API返回的json中取消设置(从普通帖子中删除细节)。实际上,我在这个示例中使用了以下内容:https://css-tricks.com/using-the-wp-api-to-fetch-posts/

我遇到的问题是,如何更改它,使其从Custom Post Type

有什么想法?

function qod_remove_extra_data( $data, $post, $context ) {
  // We only want to modify the \'view\' context, for reading posts
  if ( $context !== \'view\' || is_wp_error( $data ) ) {
    return $data;
  }

  // Here, we unset any data we don\'t want to see on the front end:
  unset( $data[\'author\'] );
  unset( $data[\'status\'] );
  unset( $data[\'featured_image\'] );
  //etc etc

  return $data;
}

add_filter( \'json_prepare_post\', \'qod_remove_extra_data\', 12, 3 );
自定义帖子类型的新示例**

function projectPost_remove_extra_data( $data, $post, $context ) {

  // We only want to modify the \'view\' context, for reading posts
  if ( $context !== \'view\' || is_wp_error( $data ) ) {
    return $data;
  }

  // Here, we unset any data we don\'t want to see on the front end:
  unset( $data[\'author\'] );
  unset( $data[\'status\'] );



  return $data;
}

add_filter( \'json_prepare_project\', \'projectPost_remove_extra_data\', 12, 3 );

2 个回复
最合适的回答,由SO网友:Cristopher Gonzalez Vega 整理而成

如果可能,internet中仅显示以下示例:

function qod_remove_extra_data($data, $post, $context) {
    // We only want to modify the \'view\' context, for reading posts 
    if ($context !== \'view\' || is_wp_error($data)) {
        return $data; 
    } 
    // Here, we unset any data we do not want to see on the front end: 
    unset($data[\'author\']); 
    unset($data[\'status\']); 
    // Continue unsetting whatever other fields you want return $ data;
}
add_filter(\'json_prepare_post\', \'qod_remove_extra_data\', 12, 3);
右边是:

function qod_remove_extra_data($data, $post, $context) {
    // We only want to modify the \'view\' context, for reading posts 
    if ($context !== \'view\' || is_wp_error($data)) {
         unset ( $data->data[\'excerpt\']); //Example
         unset ($data->data[\'content\']); //Example
         unset ($data->data[\'name field to remove\']); 
         //or 
         unset ($data->data[\'name field to remove\'][\'name subfield if you only want to delete the sub-field of field\']); 
         return $data; 
     }
}
add_filter(\'rest_prepare_post\', \'qod_remove_extra_data\', 12, 3);
重要提示:Is:

add_filter(\'rest_prepare_post\', \'qod_remove_extra_data\', 12, 3);
非:

add_filter(\'json_prepare_post\', \'qod remove extra_data\', 12, 3); //WRONG (No underscores)
如果是自定义帖子类型:

add_filter(\'rest_prepare_{$post_type}\', \'qod_remove_extra_data\', 12, 3);
示例:Name post type=产品;

 add_filter(\'rest_prepare_product\', \'qod_remove_extra_data\', 12, 3);
使用此代码可以删除需要JSON的字段。通过使用rest\\u prepare}{$post\\u type,您可以消除每个post\\u类型字段,从而只影响您想要的post\\u类型,而不是全部。

SO网友:brianlmerritt

查看页面的wp api代码(这是自定义帖子类型)。

您可以修改代码,将页面更改为调用的任何帖子类型(只需小心搜索和替换所有“页面”,因为其中一些是wordpress函数调用或过滤器)

<?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 );
    }
}
将您的自定义代码置于编辑或筛选等状态,然后就可以开始了!

ps-别忘了把它变成一个合适的插件!您可以添加为新插件,并通过以下方式更好地管理它:

<?php
/**
 * Plugin Name: My JSON App API
 * Description: My Route and Endpoint handler for the JSON API
 * Dependency:  This plugin requires JSON BasicKey Authentication Plugin!!!! 
 * Author: Blah Blah Blah, plus much original code from the WordPress API Team
 * Author URI: https://www.example.com
 * Version: 1.2
 * Plugin URI: https://www.example.com
 */

if ( ! defined( \'ABSPATH\' ) ) exit; // Exit if accessed directly
if (!defined("MY_JSON_API_VERSION")) {
    define ("MY_JSON_API_VERSION",  "1.2") ;
}

function my_json_api_init() {
    global $my_json_api_mobile_users;
    $my_json_api_mobile_users = new my_JSON_API_MobileUsers();
    add_filter( \'json_endpoints\', array( $my_json_api_mobile_users, \'register_routes\' ) );
}
add_action( \'wp_json_server_before_serve\', \'my_json_api_init\' );