web-dev-qa-db-fra.com

WP-API JSON reposant et post méta?

OK, j'utilise ce plugin: https://github.com/WP-API/WP-API/ pour transformer mon site en API complète de repos et ça marche très bien .. Ensuite, j'utilise ce plugin pour ajouter un méta de message personnalisé: https://wordpress.org/plugins/types/ Mon problème est que je n'arrive pas à interroger le point de terminaison de l'URL pour retourner mon méta de post comme si je le faisais:

get_post_meta( $post_id, $key = '', $single = false )

comment je fais à ce sujet? Chris

1
vimes1984

Les publications personnalisées ignorent le filtre normal. Consultez class-wp-json-pages.php pour savoir comment en créer un pour les publications personnalisées.

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

Remplacez "Pages" par "MyCustomPostTypes" et la page par "mycustomposttype". Faites juste attention à ne pas renommer le code interne WordPress qui utilise également le terme page

Remarque: il est probablement préférable d'ajouter ceci en tant que plugin plutôt que de changer le plugin 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: 
 */
1
brianlmerritt

Si vous connaissez la clé de votre méta-champ, vous pouvez utiliser ce filtre:

add_filter( 'json_prepare_post', function ( $data, $post, $context) {
    $data['myextradata'] = array(
        'somekey' => get_post_meta( $post['ID'], 'abcdef', true ),
    );
    return $data;
}, 10, 3 );

Remplacez abcdef par la clé de votre méta-champ. Ensuite, si vous obtenez un message "posts", la méta-valeur de abcdef sera dans myextradata index.

Je ne suis pas familier avec le plugin "Types", mais un rapide coup d'œil sur votre base de données WordPress MySQL devrait révéler les noms des clés que "Types" utilise pour ses métafields.

Source: https://wordpress.org/support/topic/custom-meta-data-2

2
user3159159