Tentando obter meta post personalizada através da API JSON do Jetpack [fechada]

4

Estou usando o Jetpack para Wordpress para produzir uma API JSON para meu tipo de postagem personalizado Eventos , que funciona bem:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100

No entanto, este CPT também inclui alguns Post Meta Fields gerados por Meta Boxes e campos personalizados para o Wordpress . Esses campos incluem coisas como:

  • _ecmb_supporting_bands
  • _ecmb_tickets_avail
  • _ecmb_event_agelim

E, por padrão, esses campos não são retornados pela API JSON ... Tentei executar consultas como:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key='_ecmb_supporting_bands'

Ou sem aspas ao redor da meta key: https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key=_ecmb_supporting_bands

Infelizmente isso não funciona. Alguém sabe como posso retornar esses meta campos personalizados na minha resposta JSON?

    
por Jody Heavener 19.12.2013 / 19:27

2 respostas

3

Da documentação:

De acordo com o JetPack Documentos da API JSON :

  

Por padrão, todas as chaves de metadados são permitidas na API, desde que   não são chaves protegidas. Qualquer chave de metadados que comece com _ é de   padrão protegido. No entanto, chaves de metadados protegidas podem ser acessadas   e editado por usuários com o edit_post_meta (usado para edição e   visualização), recursos add_post_meta e delete_post_meta como   apropriado para cada operação. Nós também adicionamos um filtro   rest_api_allowed_public_metadata que permite especificamente   lista de permissões de determinadas chaves de metadados a serem acessadas por qualquer usuário, mesmo se   essa chave está protegida.

, então o filtro rest_api_allowed_public_metadata é o que você está procurando.

Do código-fonte:

Se você verificar o código-fonte do JetPack, você encontrará esta parte:

    function is_metadata_public( $key ) {
            if ( empty( $key ) )
                    return false;

            // whitelist of post types that can be accessed
            if ( in_array( $key, apply_filters( 'rest_api_allowed_public_metadata', array() ) ) )
                    return true;

            return false;
    }

no arquivo class.json-api-endpoints.php .

Você também pode verificar a função allow_bbpress_public_metadata() aqui para ver como implementar este filtro rest_api_allowed_public_metadata .

Exemplo:

Aqui está um exemplo semelhante para o seu caso:

/**
 * Whitelist protected meta keys
 *
 * @param array $allowed_meta_keys 
 * @return array $allowed_meta_keys 
 */
function custom_rest_api_allowed_public_metadata( $allowed_meta_keys )
{
    // only run for REST API requests
    if ( ! defined( 'REST_API_REQUEST' ) || ! REST_API_REQUEST )
        return $allowed_meta_keys;

    $allowed_meta_keys[] = '_ecmb_supporting_bands';
    $allowed_meta_keys[] = '_ecmb_tickets_avail';
    $allowed_meta_keys[] = '_ecmb_event_agelim';

    return $allowed_meta_keys;
}

add_filter( 'rest_api_allowed_public_metadata', 'custom_rest_api_allowed_public_metadata' );

com a saída JSON semelhante a esta:

"metadata":[{"id":"196711","key":"_ecmb_event_agelim","value":"18"},
            {"id":"196709","key":"_ecmb_supporting_bands","value":"The Rolling Stones"}, 
            {"id":"196710","key":"_ecmb_tickets_avail","value":"5500"}]
    
por birgire 03.01.2014 / 13:33
1

Além da resposta @birgire, colocar o código do filtro em algum lugar pode ser complicado:

  • Se você colocá-lo no arquivo "functions.php" de seu tema, uma atualização de tema poderá substituir seu código
  • Escrever um plugin apenas para adicionar um filtro é muito fuzz

É por isso que o que fiz foi usar o seguinte plug-in que permite que você escreva suas ações e filtros personalizados no painel de administração do Wordpress sem precisar se preocupar em perdê-lo. enlace .

Eu tive o mesmo problema que você e depois de incluir o filtro agora funciona como um encanto.

    
por Jose Antonio Escobar Garcia 22.06.2014 / 14:58