Wordpress Rest API opsional endpoint opsional param

15

Apakah mungkin untuk menggunakan register_rest_route()parameter opsional di url?

Katakanlah rute terdaftar dengan cara ini:

register_rest_route( 'api', '/animals/(?P<id>\d+)', [
   'methods' => WP_REST_Server::READABLE,
   'callback' => 'get_animals',
   'args' => [
        'id'
    ],
] );

Sekarang mungkin untuk melakukan panggilan api pada url seperti / wp-json / api / animals / 15 , tetapi apakah ada cara untuk mendeklarasikan param sebagai opsional untuk juga menangkap rute seperti / wp-json / api / animals / .

Saya juga mencoba mendeklarasikan rute seperti di bawah ini, tetapi tidak berhasil:

/animals/(?P<id>\d+)?

Anda dapat mendeklarasikan rute lain tanpa param atau memanfaatkan paritt GET, tetapi apakah sudah ada cara untuk melakukan ini di register_rest_route()?

Terima kasih atas saran Anda.

rozklad
sumber

Jawaban:

18

Anda harus memasukkan parameter yang dinamai regex rute ke dalam grup penangkapan opsional:

register_rest_route( 'api', '/animals(?:/(?P<id>\d+))?', [
   'methods' => WP_REST_Server::READABLE,
   'callback' => 'get_animals',
   'args' => [
        'id'
    ],
] );

Parameter kedua hanyalah sebuah regex, sehingga Anda dapat menggunakan logika regex normal untuk membuatnya lebih kompleks

Nicola Peluchetti
sumber
3

Mungkin ada cara untuk melakukannya dengan satu register_rest_routepanggilan fungsi, saya tidak tahu bagaimana melakukannya dan itu akan ideal. Namun, menduplikasi register_rest_routepanggilan fungsi dalam metode doyan akan melakukan apa yang Anda inginkan.

register_rest_route( 'api', '/animals/', [
   'methods' => WP_REST_Server::READABLE,
   'callback' => 'get_animals'
] );

register_rest_route( 'api', '/animals/(?P<id>\d+)', [
   'methods' => WP_REST_Server::READABLE,
   'callback' => 'get_animals',
   'args' => [
        'id'
    ],
] );

Jika metode get_animal Anda ingin memiliki kondisi yang menangani setiap kasus. Satu untuk jika idarg diatur, dan fallback memeriksa $_GETvariabel.

jackreichert
sumber