我最早什么时候可以得到查询到的对象ID?

时间:2014-05-09 作者:Andy

我正在写一个补充插件Wordpress Mobile Pack 因为我想在指定了特定页面模板的页面上使用默认主题。我的插件将只处理该插件的移动切换器部分,因此可以忽略其他组件(我认为)。

查看的源wpmp_switcher.php, 所有的add_actionadd_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\');
通过使用plugins_loaded 挂钩:

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是,thewpmp_switcher_init 函数调用太晚。这个functions.php 桌面模板和移动模板的文件都试图加载,由于重新定义了函数,导致致命错误。

如果可以在此之前检索模板,我不确定如何进行检索。看起来我需要使用setup_theme 钩如果我能想出如何做到这一点,我可能只需要插件中的一个函数,因为setup_theme 之前已调用init.

非常感谢您的帮助!

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

一种更简洁、更像WordPress的方式,使用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\' );

SO网友:Andy

我找到了answer on 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\');
希望这对其他人有帮助!

结束

相关推荐

将iPad排除在wp_is_mobile之外

我正在经历一个非常恼人的问题。我用媒体查询和is\\U mobile建立了我的网站(认为is\\U mobile和小屏幕一样。我真傻。)但经过一些测试后,显然iPad有点搞砸了(好吧,实际上是我搞砸了)。如果我可以将iPad从wp\\U is\\U移动功能中排除,我的所有问题都可以轻松解决。如何重写该函数?function wp_is_mobile() { static $is_mobile; if ( isset($is_mobile) )