Como obter meta meta personalizada usando a API REST

9

Estou tentando criar uma API REST para o meu site wordpress, que é usado para listar instalações usando o plugin do gerenciador de tarefas wordpress.

Registrei minha postagem personalizada, taxonomias em \ plugins \ rest-api \ plugin.php.

A API abaixo fornece todas as listagens com resposta padrão.

http: // localhost / sports / wp-json / wp / v2 / joblisting /

Eu queria adicionar uma meta meta na resposta JSON usando o código abaixo.

function slug_register_phone_number() {
            register_rest_field( 'job_listing',
                'phone',
            array(
                'get_callback' => 'slug_get_phone_number',
                'update_callback' => null,
                'schema' => null,
            )
        );
    }

    function slug_get_phone_number($post, $field_name, $request) {
        return get_post_meta($post->id, '_phone' );
    }
}

Usando o código acima, sou capaz de adicionar "telefone" como uma resposta REST, mas estou sempre recebendo telefone = falso em resposta. Não está mostrando os dados corretos da tabela wp_postmeta.

Eu segui os links mencionados abaixo para referência.

http://v2.wp-api.org/extending/modifying/

Conecte os detalhes. 1. Gerenciador de tarefas WP 2. rest-api

Qualquer ajuda será realmente útil.

Hari Soni
fonte
onde você vê o "falso"? Você verificou o que realmente está acontecendo no "fio" com as ferramentas de rede do navegador?
Mark Kaplun #
Oi, eu estou recebendo JSON como resposta.
Hari Soni 23/05
Estou usando o carteiro de plugins chrome para acessar o serviço. Não estou usando nenhum tipo de autenticação. É uma solicitação simples da API sem nenhum dado no corpo da solicitação.
Hari Soni 23/05
então, como você sabe que realmente aciona a publicação correta? você chega a esse retorno de chamada?
Mark Kaplun
Eu sou novo em PHP e wordpress. Estou trabalhando com JAVA há muito tempo. Você poderia me informar como posso verificar se minha função foi chamada ou não? Tentei imprimir o objeto post, mas não é capaz de ver o valor ..
Hari Soni

Respostas:

5

$postna função de retorno de chamada é uma matriz, não um objeto. Então você não pode usar $post->id. Altere para $post['id']e deve funcionar:

function slug_get_phone_number($post, $field_name, $request)
{
    return get_post_meta($post['id'], '_phone', true);
}

Eu recomendo mudar _phonepara phone_numberou qualquer outra coisa sem prefixo de sublinhado. Porque _é frequentemente usado com meta chaves privadas. Tente adicionar um campo personalizado que possua meta-chave com _prefixo diretamente no seu post, você verá o que eu quis dizer.

SarahCoding
fonte
16

A API do WP possui um rest_prepare_postfiltro (ou rest_prepare_CPTse você estiver trabalhando com postagens personalizadas) que pode ser usado para modificar a resposta JSON. No seu caso, será rest_prepare_joblisting.

function filter_joblisting_json( $data, $post, $context ) {
$phone = get_post_meta( $post->ID, '_phone', true );

if( $phone ) {
    $data->data['phone'] = $phone;
}

return $data;
}
add_filter( 'rest_prepare_joblisting', 'filter_joblisting_json', 10, 3 );

Usando o mesmo filtro, você também pode remover campos / dados da resposta e fazer qualquer manipulação dos dados.

Boris Kuzmanov
fonte
+1, pois provavelmente é uma maneira melhor do que tentar obter cada informação em solicitações diferentes, como o OP parece fazer.
Mark Kaplun
Esta solução funcionou perfeitamente para mim
Asif
2

Basta adicionar esses métodos ao function.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'name-of-post-type', 'name-of-field-to-return', array-of-callbacks-and-schema() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 //get the id of the post object array
 $post_id = $object['id'];

 //return the post meta
 return get_post_meta( $post_id );
}
Nuwan
fonte
0

Aqui está um exemplo de POO:

class MetaDataFetcher{

    public function enableAPIroute(){
        add_action ('rest_api_init', array($this, 'doRegisterRoutes'));
    }

    public function doRegisterRoutes(){
        register_rest_route(
            'yournamespace/vXX',
            'fetch-post-meta',
            array(
                'methods'               => array('GET','POST'),
                'callback'              => array($this, 'returnMetaData'),

                //You should have a better auth, or this endpoint will be exposed
                permission_callback'   => function(){return TRUE;}
        );
    }

    public function returnMetaData(){
        if (!(isset($_REQUEST['post-id']))){
            return "ERROR: No post ID";
        }
        $postID = $_REQUEST['post-id'];
        $meta = get_post_meta($postID);
        $meta = json_encode($meta);
        return $meta;
    }
}

$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();
John Dee
fonte