WordPress

tworzenie wtyczek — błąd REST API w edytorze bloków dla niestandardowych szablonów

  • 8 lutego, 2023
  • 3 min read
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’)

Warto przeczytać!  Jak wyświetlać bloki reklam w określonych postach w WordPress

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.

Warto przeczytać!  css — Co sprawia, że ​​WP jest tak przyjazne SEO?

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.


Źródło