Рубрики
Uncategorized

Создайте Свой Собственный API Меню WordPress

Что Мы Будем Делать Мы собираемся создать 3 конечные точки REST API, предназначенные для того, чтобы мы могли… С тегами wordpress, php, rest.

Что Мы Будем Делать

Мы собираемся создать 3 конечные точки REST API, предназначенные для того, чтобы мы могли получать наши меню несколькими различными способами.

  1. Получить одно меню по его идентификатору
  2. Получить одно меню по его названию (слизняк)
  3. Получите единое меню по его тематическому расположению

Мы собираемся создать единый класс, Навигационное меню , для управления этими функциями.

Я должен упомянуть, что одно из ограничений этой сборки заключается в том, что она не предоставляет способа фильтрации результатов по родителю. Я не использовал подменю в своей личной сборке своего сайта, поэтому не стал добавлять эту функциональность. Дочерние пункты меню будут отображаться при этой сборке, но вам придется отфильтровать результаты с помощью метода Javascript array.filter() или просто встроить его непосредственно в конечную точку с помощью дополнительного аргумента или что-то в этом роде. Я уверен, что есть лучший запрос к базе данных, который можно выполнить, чтобы получить результаты только там, где родителем является X, но это выходит за рамки этого урока.

Создайте Свой Класс Навигационного Меню

По моему опыту, обычно проще создать класс, который сначала будет обрабатывать функциональность, а затем создавать статические методы, которые позже будут использоваться в качестве обратных вызовов api. Создайте новый файл под названием NavMenu.php и поместите его в свой плагин. Обязательно включите его в свой основной файл плагина!

menus = wp_get_nav_menu_items($menu_name_or_id);
 }

}
?>

Мы начнем с простого и захватим список пунктов меню с помощью wp_get_nav_menu_items() К счастью, эта функция будет работать с либо с именем меню, либо с идентификатором меню, что на данный момент делает наш конструктор довольно простым.

Также обратите внимание, что мы используем пространство имен как menu\lib\app . Это помогает снизить вероятность коллизий имен с нашим кодом и другими плагинами, и именно поэтому я не назвал класс чем-то вроде АСНавМеню .

Прямо сейчас, если мы запустим var_dump(новый asmenus\lib\app\navmenu($menu_name_or_id)); где вы замените $menu_name_or_id допустимым именем или идентификатором меню, он выведет всю соответствующую информацию, относящуюся к пунктам в этом меню.

Создайте Способ Получения Меню По его Местоположению

Теперь, когда у нас есть способ получить меню по идентификатору меню и пуле меню, нам нужно создать способ получения меню по его местоположению. Немного покопавшись, я обнаружил, что расположение меню и соответствующие им идентификаторы меню хранятся в базе данных как мод темы. Чтобы получить к этому доступ, нам просто нужно добавить метод в наш класс.

menus = wp_get_nav_menu_items($menu_name_or_id);
 }

 /**
 * Gets the menu ID from the specified location
 *
 * @param $location
 *
 * @return mixed
 */
 public function getMenuIdFromLocation($location){
    $locations = get_theme_mod('nav_menu_locations');

    return $locations[$location];
 }

}
?>

Здесь мы добавили новый метод, getMenuId из местоположения . Этот метод использует get_theme_mod возвращает ассоциативный массив с идентификаторами меню, определяемыми местоположением меню. Итак, передав параметр $location , мы можем получить нужный идентификатор меню.

Теперь нам просто нужно использовать эту функцию в нашем конструкторе.

getMenuIdFromLocation($menu_name_or_id);

    $this->menus = wp_get_nav_menu_items($menu_name_or_id);
 }

 /**
 * Gets the menu ID from the specified location
 *
 * @param $location
 *
 * @return mixed
 */
 public function getMenuIdFromLocation($location){
    $locations = get_theme_mod('nav_menu_locations');

    return $locations[$location];
 }

}
?>

В нашем конструкторе мы добавляем необязательный второй аргумент, $type , который, если тип установлен в 'местоположение' , наш конструктор будет использовать getMenuIdFromLocation для получения правильного идентификатора меню на основе указанного местоположения в нашем первом аргументе, $menu_name_or_id .

Прямо сейчас, если мы запустим var_dump(новый как меню\lib\приложение\Навигационное меню($menu_location,'местоположение')); где вы замените $menu_location допустимым местоположением меню, он выведет всю соответствующую информацию, относящуюся к пунктам в этом меню.

Создайте функции обратного вызова REST API

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

getMenuIdFromLocation($menu_name_or_id);

    $this->menus = wp_get_nav_menu_items($menu_name_or_id);
 }

 /**
 * Gets the menu ID from the specified location
 *
 * @param $location
 *
 * @return mixed
 */
 public function getMenuIdFromLocation($location){
    $locations = get_theme_mod('nav_menu_locations');

    return $locations[$location];
 }


 /**
 * Callback function to get the menu by name/id via the REST API
 *
 * @param \WP_REST_Request $request
 *
 * @return array|\WP_Error
 */
 public static function getMenuFromApi(\WP_REST_Request $request){
    $name_or_id = $request->get_param('name') ? $request->get_param('name') : (int) $request->get_param('id');
    $self = new self($name_or_id);

    return $self->menus;
 }

}
?>

Мы начнем с первого метода, который будет обрабатывать получение меню независимо от того, является ли оно именем или идентификатором. Как вы можете видеть, это статический метод (другими словами, мы можем получить к нему доступ, не создавая сначала экземпляр нашего класса), а первый параметр указывает на тип с помощью \WP_REST_Request . Если вы используете пространство имен, обязательно не забудьте заранее добавить \ , иначе это не сработает.

$name_or_id задается с помощью троичного оператора, что позволяет нам получать аргумент независимо от того, имя это или i d. Вы могли бы построить это как два отдельных метода, но я чувствовал, что это было чище.

Наш Завершенный Класс

Теперь нам просто нужно повторить этот процесс со вторым статическим методом, который получит меню по местоположению.

getMenuIdFromLocation($menu_name_or_id);

    $this->menus = wp_get_nav_menu_items($menu_name_or_id);
 }

 /**
 * Gets the menu ID from the specified location
 *
 * @param $location
 *
 * @return mixed
 */
 public function getMenuIdFromLocation($location){
    $locations = get_theme_mod('nav_menu_locations');

    return $locations[$location];
 }


 /**
 * Callback function to get the menu by slug/id via the REST API
 *
 * @param \WP_REST_Request $request
 *
 * @return array|\WP_Error
 */
 public static function getMenuFromApi(\WP_REST_Request $request){
    $name_or_id = $request->get_param('name') ? $request->get_param('name') : (int) $request->get_param('id');
    $self = new self($name_or_id);

    return $self->menus;
 }


 /**
 * Callback function to get the menu by location via the REST API
 *
 * @param \WP_REST_Request $request
 *
 * @return array|\WP_Error
 */
 public static function getMenuByLocationFromApi(\WP_REST_Request $request){
    $location = $request->get_param('location');
    $self = new self($location, "location");

    return $self->menus;
 }

}
?>

Единственное отличие здесь в том, что когда мы создавали экземпляр класса, мы установили второй параметр в 'местоположение' . Это говорит нашему конструктору о поиске идентификатора на основе предоставленного местоположения

Зарегистрируйте Наши Конечные Точки

Теперь, когда наш класс создан, нам просто нужно зарегистрировать наши конечные точки. Это не следует добавлять в NavMenu.php , вместо этого это должно быть либо помещено в основной файл плагина, либо в отдельный файл, который будет включен позже. В приведенном ниже примере я поместил их в основной файл плагина.

[\d]+)', [
    'methods' => ['GET'],
    'callback' => 'asmenus\lib\app\NavMenu::getMenuFromApi',
 ]);

 /**
 * Gets a single menu by slug
 */
 register_rest_route('asmenus/v1', '/menu/(?P[\w-_]+)', [
    'methods' => ['GET'],
    'callback' => 'asmenus\lib\app\NavMenu::getMenuFromApi',
 ]);

 /**
 * Gets a single menu by its theme location
 */
 register_rest_route('asmenus/v1', '/menu/location/(?P[\w-_]+)', [
    'methods' => ['GET'],
    'callback' => 'asmenus\lib\app\NavMenu::getMenuByLocationFromApi',
 ]);
});

?>

Чтобы зарегистрировать наши конечные точки, мы подключаемся к 'rest_api_init' и регистрируем наши маршруты в обратном вызове, используя register_reset_route . Обратите внимание, что к нашим обратным вызовам добавляется пространство имен, и что мы устанавливаем метод для этих конечных точек в ПОЛУЧИТЬ .

Вуаля! Когда вы посещаете любую из конечных точек, теперь вы должны получить массив объектов, содержащий всю информацию о каждом пункте меню. Отсюда вы можете создать некоторые компоненты React/Angular, которые будут проходить через цикл и создавать ваше меню.

Ищете дополнительные ресурсы WordPress?

Присоединиться WP Сервер Discord Академии разработчиков и станьте частью растущего сообщества разработчиков WordPress.

Оригинал: “https://dev.to/alexstandiford/create-your-own-wordpress-menu-api-4198”