Регистрация REST-маршрута и конечной точки Wordpress для функции, хранящейся в настраиваемом плагине - как указать на существующую функцию и путь плагина

Я застрял, пытаясь зарегистрировать маршрут REST для пользовательской функции плагина, чтобы сделать эту функцию вызываемой с помощью javascript.

В примерах показаны функции конечных точек, встроенные в сценарий регистрации в functions.php (например, по адресу https://www.sitepoint.com/creating-custom-endpoints-for-the-wordpress-rest-api/)

Однако моя функция конечной точки уже находится в файле PHP в пользовательском дереве плагинов.

Итак, я пытаюсь:

  1. Зарегистрируйте маршрут для моей конечной точки, например: www.example.com/test/v1/route_function_name

  2. Укажите его на имя моей пользовательской функции, например name_of_function

  3. Скажите, где найти эту функцию, например www.example.com/wp-content/plugins/custom-plugin-name/path-tree-stuff/public/plugin-functions-controller.php

Я застреваю на цифре 3. Проблемы:

а) Где я могу поместить ссылку на имя этой функции? Я не хочу вырывать свой код функции из этого файла и вставлять его в код регистрации маршрута.

б) Где я могу указать путь к функциональному файлу? В примерах, которые я следил, просто есть ссылки на массив, а не на фактические пути, поэтому не указывайте, как зарегистрировать маршрут к внешней конечной точке, которая не инкапсулирована в регистрационный код.

в) Я что-то упускаю? Похоже, что экранирование фактического пути к файлу php функций из JS просто приведет к его отображению в файле функций WP?

Справочник разработчика по адресу https://developer.wordpress.org/rest-api/exnding-the-rest-api/routes-and-endpoints/ похоже, что его примеры пытаются перехватить функции wordpress через настраиваемый маршрут, а не через настраиваемые функции.

Есть ли где-нибудь примеры, которые лучше подходят для моей ситуации? (Если у меня есть настраиваемая функция в настраиваемом файле в настраиваемом плагине, и мне просто нужно зарегистрировать маршрут REST и указать его на существующую функцию в существующем файле).

Пока у меня есть следующее, что явно неполно:

add_action(
    'rest_api_init',
    function () {
        register_rest_route(
            'test/v1',
            '/route_function_name',
            [
                'methods' => 'POST',
                'callback' => function (WP_REST_Request $request) {

                    // Need to somehow insert here a path to my function 
                    name_of_function;

                    // Reponse is sent back by the function, so need to trap it [
                        'return-param-1' => $return-param-1,
                        'return-param-2' => $return-param-2,
                        'return-param-3' => $return-param-3,
                    ];
                },
            ]
        );
    }
);

Обоснование попытки сделать это:

  • У меня уже запущен JS-скрипт
  • Мне нужно, чтобы вызвать функцию PHP, которую я уже написал
  • Это просто: просто укажите путь к функции в JS.
  • Однако вместо этого я пытаюсь сделать это правильным способом WP (в основном из соображений безопасности, но также для успокоения духов DevProperly!)

Я предположил:

i) Место для регистрации маршрута REST находится в functions.php в активной дочерней теме;

ii) Место для моей пользовательской функции находится в файле php внутри моего существующего настраиваемого плагина;

iii) Код, который регистрирует оставшийся маршрут, должен указывать, по крайней мере, все из следующих трех вещей:

  1. URI нового маршрута REST
  2. Имя вызываемой функции php
  3. Файл и путь, по которому эта функция php может быть найдена в пути пользовательского плагина относительно / var / www.

Любое из этих предположений неверно?


person ed2    schedule 09.10.2020    source источник
comment
Для №3, если это просто функция, а не метод класса, вы должны иметь возможность просто вызвать require_once WP_PLUGIN_DIR . '/custom-plugin-name/path-tree-stuff/public/plugin-functions-controller.php'; в файле, чтобы он был доступен глобально. В идеале ваши REST-маршруты должны находиться внутри этого плагина, поскольку один также зависит от другого. Это не является абсолютным требованием, но я буквально работаю над 10-летним сайтом в данный момент со многими плагинами, которые имеют кросс-депозитарные функции, и отлаживать что-то - настоящая боль.   -  person Chris Haas    schedule 13.10.2020
comment
Если это класс, это тоже работает, но это когда вы перейдете к синтаксису в стиле массива.   -  person Chris Haas    schedule 13.10.2020
comment
Спасибо @ChrisHaas, я помещу register_rest_route в тот же файл, что и все существующие функции. В настоящее время я не вижу необходимости заключать их в классы (кроме инкапсуляции), поскольку сами функции (называемые здесь обратными вызовами) - это просто старые процедуры процедурных процессов skool; они не настроены как функции CRUD или операторы методов класса в модели ООП, и их именование достаточно защищено от конфликтов. Затем я буду использовать вышеуказанный require_once в основном файле плагина, как вы предлагаете.   -  person ed2    schedule 15.10.2020