Intereting Posts
Меню с левой стороны не отображается с выпадающим меню Не удалось обновить базу данных при создании настраиваемого модуля Динамический DropDown в форме контакта 7 Как меню WP Как фильтровать все продукты по товарам_tag (woocommerce) Nonce терпит неудачу при сохранении ajax Получить результат перезаписи Как разрешить – в названии категории Как создать файл цикла wordpress, который отображает сообщения на основе определенных условий Функция, чтобы увидеть, сколько плагинов на сайте необходимо обновить Вызов заголовка из файла JavaScript Как установить метабокс по умолчанию при создании пользователя? Отображать метаданные пользователя из текстового поля в виде форматированного текста Неверная ошибка плагина Constant Contact Отобразить другой список «Пользовательских шаблонов» для каждого настраиваемого типа страницы Если in_category не работает для нескольких страниц single.php

Фиксирование объекта WP Post для пользовательского маршрута

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

Я должен был сделать это для различных проектов в прошлом, и я всегда решал проблему, создавая настраиваемые маршруты с помощью template_include hook. По сути, я подключаюсь к WP, чтобы узнать, соответствует ли URL указанному регулярному выражению, и если да, я доставляю пользователю пользовательский шаблон страницы. По сути, это обходит встроенную систему страниц WordPress и предоставляет шаблон, который можно использовать для отображения информации о пользователе.

Например, представьте этот URL:

examplesite.com/user/joe-smith/

Мой плагин настроен вручную, чтобы перенаправить его на шаблон, который я включил в мое ядро ​​плагина. Затем этот шаблон просматривает пользователя на основе введенного URL-адреса и отображает определенные мета-поля с помощью включенного шаблона.

Все это отлично работает, однако, когда я пытаюсь загрузить global $post объект global $post и использовать его в любом месте страницы, он возвращает значения блога «Hello World». Кроме того, тегу <body> на странице автоматически присваивается class="blog" , что заставляет его наследовать стиль блога.

Мой вопрос: как я могу «перезагрузить» объект WP Post, чтобы содержать полезную информацию? Будет ли считаться неправильной практикой вручную заполнять объект WP Post до загрузки моего шаблона? Неужели я все это делаю неправильно? Я был бы признателен за любое понимание, которое может предоставить любой человек.

РЕДАКТИРОВАТЬ:

Ниже приведен мой пример кода с сайта:

 /** * class CM_Permalink_Registration * * This class is responsible for creating any custom permalinks meant to be used by the site * These are hard coded routes that will return different templates included with our plugin **/ class CM_Permalink_Registration { /** * A reference to an instance of this class. */ private static $instance; public $dependencies = null; private $permalinks_to_register = array(); public $plugin_template_path = null; public $theme_template_path = null; private function __construct($dependencies){ $this->dependencies = $dependencies; $this->plugin_template_path = $dependencies['cm_manager']->plugin_path.'core/page-templates/hard-coded/'; $this->theme_template_path = get_stylesheet_directory().'/cm-plugin-templates/'; $this->theme_path = get_stylesheet_directory().'/'; $this->permalinks_to_register = array( array( 'template_filename' => 'city-directory-page.php', 'route' => '^financial-advisor-(.+)/?$', 'rewrite' => 'index.php?location=$matches[1]', 'rewrite_tags' => array( array( 'tag' => '%location%', 'regex' => '([^&]+)' ) ), 'conditional' => 'return isset($wp->query_vars["location"]) && $this->dependencies["states_cities"]->is_valid_location_url($wp->query_vars["location"]);' ), array( 'template_filename' => 'advisor-profile.php', 'route' => '^(.+)-cfp/?$', 'rewrite' => 'index.php?advisor=$matches[1]', 'rewrite_tags' => array( array( 'tag' => '%advisor%', 'regex' => '([^&]+)' ) ), 'conditional' => 'return isset($wp->query_vars["advisor"]) && $this->dependencies["advisor"]->is_valid_advisor_url($wp->query_vars["advisor"]);' ), array( 'template_filename' => 'advisor-profile-editor.php', 'route' => '^edit-profile/(.+)/?$', 'rewrite' => 'index.php?edit=true&edit-advisor=$matches[1]', 'rewrite_tags' => array( array( 'tag' => '%edit-advisor%', 'regex' => '([^&]+)' ) ), 'conditional' => 'return isset($wp->query_vars["edit-advisor"]) && $this->dependencies["advisor"]->is_valid_advisor_url($wp->query_vars["edit-advisor"]);' ) ); $this->register_init_hook(); $this->register_template_redirect_hook(); } /** * Returns an instance of this class. */ public static function get_instance($dependencies){ if( null == self::$instance ) { self::$instance = new CM_Permalink_Registration($dependencies); } return self::$instance; } /** * public function register_custom_permalinks() * * This function registers our new routes with wordpress by adding rewrite rules **/ public function register_custom_permalinks(){ foreach($this->permalinks_to_register as $permalink){ add_rewrite_rule($permalink['route'], $permalink['rewrite'], 'bottom'); foreach($permalink['rewrite_tags'] as $tag){ add_rewrite_tag($tag['tag'], $tag['regex']); } } } /** * public function deliver_custom_templates() * * This function hooks into the template redirect hook and checks to see if the entered URL meets the specified conditions to display a custom template **/ public function deliver_custom_templates($return_template){ global $wp; $found_valid_page = false; foreach($this->permalinks_to_register as $permalink){ if(eval($permalink['conditional'])){ if (file_exists($this->theme_template_path . $permalink['template_filename'])) { $return_template = $this->theme_template_path . $permalink['template_filename']; } else{ $return_template = $this->plugin_template_path . $permalink['template_filename']; } $found_valid_page = true; } } if($found_valid_page){ include($return_template); die(); } else{ global $post, $wp_query; foreach($this->permalinks_to_register as $permalink){ if (preg_match('&'.$permalink['route'].'&', ltrim($_SERVER['REQUEST_URI'], '/')) !== 0 && !eval($permalink['conditional'])){ header("HTTP/1.0 404 Not Found - Archive Empty"); require $this->theme_path.'404.php'; exit; $wp_query->is_404 = true; } } } return $return_template; } /** * private function register_template_redirect_hook() * * This function is responsible for hooking in our register_custom_permalinks() method to the template_redirect hook **/ private function register_template_redirect_hook(){ add_action("template_include", array(&$this, 'deliver_custom_templates')); } private function register_init_hook(){ add_action('init', array(&$this, 'register_custom_permalinks')); } } 

В частности, здесь вы можете увидеть настройку регистрации правила / перезаписи тегов:

 foreach($this->permalinks_to_register as $permalink){ add_rewrite_rule($permalink['route'], $permalink['rewrite'], 'bottom'); foreach($permalink['rewrite_tags'] as $tag){ add_rewrite_tag($tag['tag'], $tag['regex']); } } 

Для запросов vars я использую add_rewrite_tag для регистрации нового запроса var для каждой конечной точки. Например, правило перезаписи для одной из моих страниц выглядит так:

'rewrite' => 'index.php?advisor=$matches[1]'

Единственный запрос, который я явно задал, – это новая настраиваемая переменная «советник». Должен ли я настраивать что-то еще, чтобы сделать эту работу правильно?