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.