REST API'sini kullanarak özel yayın metaları nasıl edinilir


9

Wordpress iş yöneticisi eklentisini kullanarak tesis listesi için kullanılan benim wordpress web sitesi için bir REST API oluşturmaya çalışıyorum.

Özel yazımı, sınıflandırmalarını \ plugins \ rest-api \ plugin.php dosyasına kaydettirdim.

Aşağıdaki API bana varsayılan yanıtı olan tüm listeleri verir.

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

Aşağıdaki kodu kullanarak JSON yanıt sonrası meta meta eklemek istedim.

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

Yukarıdaki kodu kullanarak bir REST yanıtı olarak "telefon" eklemek mümkün ama her zaman yanıt telefon = yanlış alıyorum. Wp_postmeta tablosundan doğru verileri göstermiyor.

Referans için aşağıda belirtilen bağlantıları takip ettim.

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

Eklenti ayrıntıları. 1. WP İş yöneticisi 2. rest-api

Herhangi bir yardım gerçekten yardımcı olacaktır.


"yanlış" ı nerede görüyorsun? Tarayıcının ağ araçlarıyla "kabloda" neler olup bittiğini kontrol ettiniz mi?
Mark Kaplun

Merhaba ben JSON bir yanıt olarak alıyorum.
Hari Soni

Servise ulaşmak için krom eklentisi postacı kullanıyorum. Herhangi bir kimlik doğrulaması kullanmıyorum. Bu istek gövdesinde herhangi bir veri olmadan basit bir API isteği.
Hari Soni

o zaman doğru gönderiyi tetiklediğinizi nasıl anlarsınız? bu geri aramaya bile var mı?
Mark Kaplun

PHP ve wordpress için yeniyim. JAVA ile uzun süredir çalışıyorum. İşlevimin çağrılıp çağrılmadığını nasıl kontrol edebileceğimi lütfen bana bildirir misiniz? Yazı nesnesini yazdırmaya çalıştım ama değeri göremiyorum ..
Hari Soni

Yanıtlar:


6

$postolarak geri arama işlevi bir dizi değil, bir amacıdır. Yani kullanamazsın $post->id. Bunu olarak değiştirin $post['id']ve çalışması gerekir:

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

Ben değişikliğine tavsiye _phoneetmek phone_numberalt çizgi öneki olmadan veya başka bir şey. Çünkü _genellikle özel meta anahtarları ile kullanılır. _Doğrudan yayınıza önek içeren meta anahtar içeren özel bir alan eklemeye çalışın , ne demek istediğimi göreceksiniz.


16

WP API, JSON yanıtını değiştirmek için kullanabileceğiniz bir rest_prepare_postfiltreye (veya rest_prepare_CPTözel yayınlarla çalışıyorsanız) sahiptir. Senin durumunda olacak 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 );

Aynı filtreyi kullanarak yanıttan alanları / verileri kaldırabilir ve verilerin üzerinde herhangi bir değişiklik yapabilirsiniz.


+1 muhtemelen OP'nin yaptığı gibi farklı isteklerde her bilgiyi almaya çalışmaktan daha iyi bir yoldur.
Mark Kaplun

Bu çözüm benim için mükemmel çalıştı
Asif

2

Bu yöntemleri function.php dosyasına eklemeniz yeterlidir

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

0

İşte bir OOP örneği:

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.