tworzenie wtyczek — błąd REST API w edytorze bloków dla niestandardowych szablonów
Pracuję nad wtyczką, która dodaje niestandardowe szablony do WordPress do użytku z aktywnym motywem. Pliki szablonów znajdują się w katalogu wtyczek i są przekazywane do WordPress z rozszerzeniem theme_templates
hak.
To, co mnie zaskakuje, to jedna mała odmiana instrukcji if, która powoduje, że interfejs API REST zwraca błąd podczas uruchamiania funkcji WP_REST_Posts_Controller::check_template(). Błąd występuje tylko w edytorze bloków, ponieważ edytor klasyczny pomija kontrolę REST API.
To jest moja funkcja.
public function add_custom_templates($templates)
{
global $post_type;
/**
* Collect an array of templates files
*/
$templates = $this->template_files();
foreach ($templates as $template) {
/**
* Get header info from template file to parse template name and post type(s)
*/
$data = get_file_data( MY_TEMPLATES_PATH . $template, array(
'name' => 'Template Name',
'post_type' => 'Template Post Type'
));
// remove spaces if present
$trimmed = str_replace(' ', '', $data['post_type']);
//convert template data post type string to array
$post_types = explode(',', $trimmed);
// THIS WORKS <---
if (!empty($data['name']) && !empty($data['post_type'])) {
$custom_templates[$template] = $data['name'];
}
// THIS DOES NOT WORK <---
// if (!empty($data['name']) && !empty($data['post_type']) && in_array($post_type, $post_types)){
// $custom_templates[$template] = $data['name'];
// }
}
// manual override
$custom_templates['example.php'] = 'fake template';
return $custom_templates;
}
}
Załóżmy, że $szablony = array(’jeden.php’, dwa.php, trzy.php’)
one.php
ma następujący blok komentarza pod tagiem otwierającym
/*
* Template Name: Template One
* Template Post Type: post, page
*/
two.php
ma następujący blok komentarza pod tagiem otwierającym
/*
* Template Name: Template Two
* Template Post Type: post, product
*/
three.php
ma następujący blok komentarza pod tagiem otwierającym
/*
* Template Name: Template Three
* Template Post Type: page, product
*/
Ta działająca instrukcja if zwraca wszystkie szablony i pozwala na zapisywanie/aktualizację wewnątrz edytora bloków bez błędów z REST API
if (!empty($data['name']) && !empty($data['post_type'])) {
$custom_templates[$template] = $data['name'];
}
$custom_templates zwraca następującą tablicę: array(4) { ["one.php"]=> string(12) "Template One" ["two.php"]=> string(12) "Template Two" ["three.php"]=> string(14) "Template Three" ["example.php"]=> string(13) "fake template" }
Jednak to stwierdzenie powoduje, że wszystkie 3 szablony są dostępne bez względu na typ postu. Chcę dołączyć szablon tylko wtedy, gdy plik $data[’post_type’] pasuje do globalnego $post_type dla danego postu.
Ta instrukcja if ma ją ograniczyć zgodnie z moimi intencjami.
if (!empty($data['name']) && !empty($data['post_type']) && in_array($post_type, $post_types)){
$custom_templates[$template] = $data['name'];
}
Podczas uruchamiania tylko drugiej instrukcji if na „stronie”, $custom_templates zwraca następującą tablicę:array(3) { ["one.php"]=> string(12) "Template One" ["three.php"]=> string(14) "Template Three" ["example.php"]=> string(13) "fake template" }
* Bez względu na to, która instrukcja if jest używana, ręczne zastąpienie, które dodałem jako tymczasową kontrolę poprawności, można wybrać i zapisać pomimo braku rzeczywistego pliku.
Podczas uruchamiania instrukcji if z in_array($post_type, $post_types)
poprawnie zwraca szablony, które chcę zwrócić, ale każda próba wybrania i zapisania tego szablonu w edytorze bloków powoduje wyrzucenie przez interfejs API REST błędu „Aktualizacja nie powiodła się. Nieprawidłowy parametr(y): szablon”.
Każda pomoc byłaby bardzo mile widziana, ponieważ jestem zaskoczony, dlaczego interfejs API REST blokuje żądanie * tylko podczas dodawania dodatkowej kontroli do mojej instrukcji if.