Desmarcar datos en la API de WordPress de tipo de publicación personalizada (wp-json)

2

Ya puedo desarmar (eliminar detalles de publicaciones normales) en el json devuelto por la API de WordPress. En realidad, utilizo lo siguiente a continuación de este ejemplo: enlace

Con lo que tengo problemas y no puedo resolverlo, es cómo cambiar esto para que no se borren los datos de un Tipo de publicación personalizado

¿Pensamientos?

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

nuevo ejemplo con tipo de publicación personalizada **

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 );
    
pregunta RMH 11.09.2015 - 00:41

2 respuestas

6

Si es posible, solo los ejemplos que se muestran en Internet son:

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)) {
        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);

y la derecha es:

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

IMPORTANTE: Es:

add_filter ('**rest_prepare_post**', 'qod_remove_extra_data', 12, 3);

No:

add_filter ('**json_prepare_post**' 'qod remove extra_data', 12, 3); //WRONG (No underscores)

Si es tipo de publicación personalizada:

add_filter ('**rest_prepare_{$post_type}**', 'qod_remove_extra_data', 12, 3);

EJEMPLO: Nombre tipo de publicación = producto;

 add_filter ('**rest_prepare_product**', 'qod_remove_extra_data', 12, 3);

Con este código puedes eliminar los campos que deseas que JSON. Al usar rest_prepare} _ {$ post_type, decida que haya eliminado todos los campos de post_type, por lo tanto, solo afectó el tipo de post que desea y no todos.

    
respondido por el Cristopher Gonzalez Vega 06.01.2016 - 01:59
0

Eche un vistazo al código wp-api para páginas (que son tipos de publicación personalizados).

Puede modificar el código, cambiando las páginas a como sea que se llame su tipo de publicación (solo tenga cuidado de hacer una búsqueda y reemplace todas las "páginas" ya que algunas de ellas son llamadas o filtros de función de 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 );
    }
}

Ponga su código personalizado en edición o filtro, etc., ¡y listo!

ps: ¡no olvides convertirlo en un complemento adecuado! Puede agregar un nuevo complemento y administrarlo mejor de esa manera usando:

<?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' );
    
respondido por el brianlmerritt 27.10.2015 - 22:37

Lea otras preguntas en las etiquetas