Вопрос или проблема
Я создаю плагин, который позволяет администраторам добавлять сотрудников в базу данных. Я создал функцию в файле класса моего плагина…
cp_libstaff_frontend_display()
…которая отображает таблицу каждого сотрудника в базе данных для пользователей на фронтенде. Эта функция привязана к короткому коду, который отображается по следующему URL:
mysite.com/librarywp/staff-directory
Теперь я хотел бы сделать ссылку на имя каждого сотрудника, которая переводит пользователя на страницу с информацией только об этом сотруднике. Например,
mysite.com/librarywp/libstaff/1
Где ‘1’ — это ID сотрудника, чью индивидуальную страницу следует получить. Я создал конечную точку для этого следующим образом:
public static function cp_libstaff_add_rewrites(){
add_rewrite_endpoint( 'libstaff', EP_PERMALINK );
}
public static function cp_libstaff_filter_request( $vars ){
if( !isset( $vars['libstaff'] ) ) $vars['libstaff'] = true;
return $vars;
}
public static function cp_libstaff_rewrite_catch_libstaff(){
if( get_query_var( 'libstaff' ) ){
echo 'WHAT NOW?';
exit();
}
}
add_action( 'init', array('Libstaff', 'cp_libstaff_add_rewrites') );
add_action( 'template_redirect', array('Libstaff', 'cp_libstaff_rewrite_catch_libstaff') );
add_filter( 'request', array('Libstaff', 'cp_libstaff_filter_request') );
После этого момента я совершенно запутался, как продвигаться с функцией обратного вызова. Должен ли быть создан пользовательский тип записи где-то здесь? Шаблон какого-либо рода?
Код в оригинальном вопросе был на правильном пути. Код ниже был взят из связанного руководства. В основном мне нужно было создать файл шаблона в моем плагине (я просто скопировал код из single.php из моей основной темы, чтобы использовать его как руководство в:
dirname( __FILE__ ) . '/staff-template.php'
Затем, когда выполняется template_redirect, он отображает этот шаблон. Это предполагает, конечно, что libstaff установлен как переменная запроса.
function cp_libstaff_rewrite_catch_libstaff() {
global $wp_query;
// если это не запрос json или единичный объект, то выходим
if ( ! isset( $wp_query->query_vars['libstaff'] ) || ! is_singular() )
return;
// включаем пользовательский шаблон
include dirname( __FILE__ ) . '/staff-template.php';
exit;
}
add_action( 'template_redirect', 'cp_libstaff_rewrite_catch_libstaff' );
Ссылка на руководство:
https://make.wordpress.org/plugins/2012/06/07/rewrite-endpoints-api/
Ответ или решение
Для создания плагина, позволяющего администраторам добавлять сотрудников в базу данных и отображать информацию о них на фронтенде сайта, вы правильно начали с добавления конечной точки и обработки запросов. Ваша функция cp_libstaff_rewrite_catch_libstaff
и реализация маршрутов являются шагами в правильном направлении. Давайте обсудим, как правильно реализовать обратный вызов для отображения информации о каждом сотруднике.
1. Создание Шаблона Данных Сотрудника
Вы уже упомянули о создании шаблона, и это действительно один из необходимых шагов. Вам нужно создать файл staff-template.php
в директории вашего плагина, и этот файл должен будет обрабатывать отображение информации о конкретном сотруднике на основе его идентификатора.
Например, код в staff-template.php
может выглядеть следующим образом:
<?php
// Получаем ID сотрудника из URL
$staff_id = get_query_var('libstaff');
// Запрашиваем информацию о сотруднике из базы данных
$staff_member = get_post($staff_id);
if ($staff_member) {
// Отображение информации о сотруднике
echo '<h1>' . esc_html($staff_member->post_title) . '</h1>';
echo '<div>' . apply_filters('the_content', $staff_member->post_content) . '</div>';
} else {
echo '<p>Сотрудник не найден.</p>';
}
?>
2. Обновление Обработчика Запроса
Ваша функция cp_libstaff_rewrite_catch_libstaff
должна проверять, есть ли запрашиваемый сотрудник и затем включать созданный шаблон. Как вы уже начали, вам нужно убедиться, что libstaff
правильно установлен как переменная запроса. Вот обновленная версия вашей функции:
function cp_libstaff_rewrite_catch_libstaff() {
global $wp_query;
// Проверяем, есть ли запрос на конечную точку libstaff и что это не стандартный запрос
if ( isset( $wp_query->query_vars['libstaff'] ) && is_singular() ) {
// Инклюдим кастомный шаблон сотрудников
include dirname( __FILE__ ) . '/staff-template.php';
exit;
}
}
3. Обновление ЧПУ (Человеко-Понятные URL)
Не забудьте обновить Пермалинки после добавления маршрутов. Это важно, поскольку изменения в правилах перезаписи могут не вступить в силу до тех пор, пока не будет выполнено обновление.
4. Проверка Наличия Идентификатора Сотрудника
Важно убедиться, что идентификатор, переданный в URL, действительно соответствует идентификатору существующей записи сотрудника. Вы можете провести дополнительную проверку перед запросом информации о сотруднике.
5. Оптимизация и Чистота Кода
Стремитесь к тому, чтобы код оставался чистым и логически структурированным. Используйте функции WordPress для экранирования данных (например, esc_html()
, esc_url()
) для безопасности вашего приложения.
Заключение
Следуя выше приведённым шагам, вы сможете создать функциональный и безопасный endpoint для просмотра информации о каждом сотруднике. Убедитесь, что ваша реализация соответствует стандартам безопасности WordPress и обеспечивает хорошую пользовательскую эффективность.
Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!