从 WordPress API (wp-json) 取消设置数据

Posted

技术标签:

【中文标题】从 WordPress API (wp-json) 取消设置数据【英文标题】:Unset data from WordPress API (wp-json) 【发布时间】:2015-12-07 06:58:53 【问题描述】:

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

我遇到了麻烦并且无法弄清楚的是如何更改此设置,以便从自定义帖子类型

中取消设置数据

想法?

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 ) 

  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'] );



  return $data;


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

【问题讨论】:

您使用的是哪个 API 版本?它正在为 v2 更改。请看:github.com/WP-API/WP-API/issues/1195 @brainlmeritt 我使用的是版本 1 【参考方案1】:

对于 wp-api v1.x,您需要扩展 WP_JSON_CustomPostType。 pages文件中有一个例子(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 );
    

将“页面”替换为“MyCustomPostTypes”,将页面替换为“mycustomposttype”。请注意不要重命名也使用术语 page 的内部 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: 
 */

【讨论】:

【参考方案2】:

从自定义帖子类型中删除数据与从内置帖子类型中删除数据应该没有什么不同。您是否确认您的 API 调用实际上正在返回您的 CPT?首先,您应该查看从以下位置返回的值:http://yourwebsite.com/wp-json/posts/types。假设您的 CPT 类型显示在那里,您应该能够查询该类型的项目,例如product,通过调用:http://yourwebsite.com/wp-json/posts?type=product

换句话说,您应该更改过滤器的名称:您仍然想绑定到json_prepare_post。如果您想让您的过滤器对帖子类型敏感,并且仅在您有 CPT 时删除某些字段,您可以执行以下操作:

function my_remove_extra_product_data( $data, $post, $context ) 
    // make sure you've got the right custom post type
    if ( 'product' !== $data[ 'type' ] ) 
        return $data;
    
    // now proceed as you saw in the other examples
    if ( $context !== 'view' || is_wp_error( $data ) ) 
        return $data;
    
    // unset unwanted fields
    unset( $data[ 'author' ] );

    // finally, return the filtered data
    return $data;


// make sure you use the SAME filter hook as for regular posts
add_filter( 'json_prepare_post', 'my_remove_extra_product_data', 12, 3 );

您可以在WP API Getting Started Guide 中找到更多文档。

【讨论】:

我将我的工作示例更新为您列出的内容,但无法取消设置任何数据。该 api 正在工作,我实际上通过 ajax 调用来获取标题、acf 字段和内容区域。 您能提供指向您网站的链接吗? 啊,好吧,听起来不错。在函数内部,作为第一行,添加以下内容:echo '&lt;pre&gt;' . print_r($data) . '&lt;/pre&gt;'; exit; 并再次运行它。这应该对 $data 变量进行 var 转储。很有可能我们正在尝试取消设置不存在的变量,或者我们正在尝试将对象成员作为数组索引来访问。 刚刚添加了它,它看起来像是第二个选项。此外,当我添加时,帖子未设置的变量现在被添加回来 好的,所以我让你添加的那行只是为了调试。把它拿出来。尝试做类似unset($data-&gt;author) 而不是unset($data['author'])【参考方案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)) 
        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);

正确的是:

qod_remove_extra_data function ($ 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);

重要提示: 是: add_filter ('rest_prepare_post' 'qod_remove_extra_data', 12, 3);

不是: add_filter('json_prepare_post' 'qod remove extra_data', 12, 3); //错误

如果是自定义帖子类型: add_filter ('rest_prepare_$post_type' 'qod_remove_extra_data', 12, 3);

示例:名称帖子类型 = 产品; add_filter ('rest_prepare_product' 'qod_remove_extra_data', 12, 3);

使用此代码可以删除您想要 JSON 的字段。通过使用 rest_prepare _ $ post_type 决定你消除了每个 post_type 字段,因此只影响你想要的 post_type 而不是全部。

【讨论】:

以上是关于从 WordPress API (wp-json) 取消设置数据的主要内容,如果未能解决你的问题,请参考以下文章

从 WordPress REST API 获取原始 HTML 输出

从 WordPress REST API JSON 响应中提取图像 url

如何使用 Wordpress REST api 从 Vuejs 向 Contact-Form-7 发送消息?

wp-json API 在使用 React 和 nonce 进行后期编辑时返回 401

Wordpress JsonAPI - 在此服务器上找不到 /wp-json/

wordpress rest api 授权