Intereting Posts
Создание первой публикации более широкой, чем другие сообщения на домашней странице (по умолчанию) Как добавить текстовые блоки WordPress Почему так много популярных тем WordPress «в штучной упаковке» на 940 пикселей? Как изменить каталог загрузки файлов на версии 3.5? Настроить определенную страницу в бэкэнде wordpress (admin), т.е. Страницы> О Показывать список пользовательских сообщений с соответствующими вложениями? Можно ли добавить подменю в подменю второго уровня – WordPress Admin Удаление ссылки «<a>» из меню «<li>» для некоторых «ссылок» без JS Есть ли крючки, которые изменяют логику 404? Пример запроса сообщений, отображающих последнее сообщение с помощью избранного изображения Есть ли способ активировать другую тему для определенных пользователей? Отображать только заголовок, когда есть результаты Как переписать URL-адрес вызова AJAX для admin-ajax.php для соответствия URL-адресам стиля REST Перечислите термины пользовательской таксономии со ссылками на странице таксономии Пользовательский тип сообщения возвращает неверный идентификатор сообщения

Какова самая ранняя точка, с которой я могу получить идентификатор запрашиваемого объекта?

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

Глядя на источник для wpmp_switcher.php , все вызовы add_action и add_filter релевантности не находятся в функции – они выполняются, когда файл включен как таковой:

 add_action('init', 'wpmp_switcher_init'); add_action('admin_menu', 'wpmp_switcher_admin_menu'); add_action('wp_footer', 'wpmp_switcher_wp_footer'); add_filter('stylesheet', 'wpmp_switcher_stylesheet'); add_filter('template', 'wpmp_switcher_template'); add_filter('option_home', 'wpmp_switcher_option_home_siteurl'); add_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl'); 

Я удалил действия / фильтры, связанные с тем, что делает плагин WPMP тикающим с помощью plugins_loaded hook:

 function remove_all_wpmp_switchers() { remove_action('init', 'wpmp_switcher_init'); remove_action('admin_menu', 'wpmp_switcher_admin_menu'); remove_action('wp_footer', 'wpmp_switcher_wp_footer'); remove_filter('stylesheet', 'wpmp_switcher_stylesheet'); remove_filter('template', 'wpmp_switcher_template'); remove_filter('option_home', 'wpmp_switcher_option_home_siteurl'); remove_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl'); } add_action('plugins_loaded', 'remove_all_wpmp_switchers'); 

Все идет нормально.

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

 function wpmp_switcher_exclusions_init(WP_Query $wp_query) { $template_file_name = get_post_meta($wp_query->get_queried_object_id(), '_wp_page_template', true); if ($template_file_name != 'my-responsive-template.php') { wpmp_switcher_init(); add_action('admin_menu', 'wpmp_switcher_admin_menu'); add_action('wp_footer', 'wpmp_switcher_wp_footer'); add_filter('stylesheet', 'wpmp_switcher_stylesheet'); add_filter('template', 'wpmp_switcher_template'); add_filter('option_home', 'wpmp_switcher_option_home_siteurl'); add_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl'); } } add_action('parse_query', 'wpmp_switcher_exclusions_init'); 

Проблема заключается в том, что даже уже с помощью parse_query hook функция wpmp_switcher_init называется слишком поздней. Файлы functions.php для рабочего стола и мобильных шаблонов пытаются загрузить, что приводит к фатальным ошибкам из-за переопределенных функций.

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

Любая помощь с этим ОЧЕНЬ высоко ценится!

Более компактный и способ WordPress-ish, используя url_to_postid() :

 function wpmp_switcher_exclusions_init() { $pid = url_to_postid( home_url( add_query_arg( array() ) ) ); if ( (int) $pid > 0 && get_post_meta( $pid, '_wp_page_template', TRUE ) === 'my-responsive-template.php' ) { remove_action('init', 'wpmp_switcher_init'); remove_action('admin_menu', 'wpmp_switcher_admin_menu'); remove_action('wp_footer', 'wpmp_switcher_wp_footer'); remove_filter('stylesheet', 'wpmp_switcher_stylesheet'); remove_filter('template', 'wpmp_switcher_template'); remove_filter('option_home', 'wpmp_switcher_option_home_siteurl'); remove_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl'); } } add_action( 'setup_theme', 'wpmp_switcher_exclusions_init' ); 

Я нашел ответ на StackOverflow (как насчет этого?). В принципе, мой код выглядит следующим образом:

 function wpmp_switcher_exclusions_init() { // Try to get post slug from the URL since the global $post object isn't available this early $post = get_page_by_path($_SERVER['REQUEST_URI'], OBJECT, 'page' ); if (!$post) $post = get_page_by_path(untrailingslashit($_SERVER['REQUEST_URI']), OBJECT, 'page' ); if (!$post) $post = get_page_by_path(substr(untrailingslashit($_SERVER['REQUEST_URI']),1), OBJECT, 'page' ); if (!$post) return; $template_file_name = get_post_meta($post->ID, '_wp_page_template', true ); if ($template_file_name == 'my-responsive-template.php') { remove_action('init', 'wpmp_switcher_init'); remove_action('admin_menu', 'wpmp_switcher_admin_menu'); remove_action('wp_footer', 'wpmp_switcher_wp_footer'); remove_filter('stylesheet', 'wpmp_switcher_stylesheet'); remove_filter('template', 'wpmp_switcher_template'); remove_filter('option_home', 'wpmp_switcher_option_home_siteurl'); remove_filter('option_siteurl', 'wpmp_switcher_option_home_siteurl'); } } add_action('setup_theme', 'wpmp_switcher_exclusions_init'); 

Надеюсь, это поможет кому-то еще!