【问题标题】:Load custom page templates in WordPress admin dashboard在 WordPress 管理仪表板中加载自定义页面模板
【发布时间】:2020-05-24 00:51:22
【问题描述】:

我的主题中有几个自定义页面模板。但是我想用插件隐藏一些,只在已经设置为首页“is_front_page”或“is_home”的页面上显示自定义主页模板。这就是我在插件中用来阻止某些页面模板出现的方法。

这适用于一个大型多站点,其中有两层站点,一个具有完整的功能集,另一个具有发育不良的集合。除了这个,我的一切都按我的需要工作。

add_filter( 'theme_page_templates', 'je_remove_page_template' );
  function je_remove_page_template( $pages_templates ) {
  unset( $pages_templates['page-topimage.php'] );
  unset( $pages_templates['page-home.php'] );
  return $pages_templates;
}

上面的代码工作得很好,但是当页面设置为主页时,我需要一个条件来显示 page-home.php。我已经尝试过这段代码,但它不起作用。

if ( is_front_page() ) :

    add_filter( 'theme_page_templates', 'je_remove_page_template' );
    function je_remove_page_template( $pages_templates ) {
    unset( $pages_templates['page-topimage.php'] );
    return $pages_templates;
    }

    else :

    function je_remove_page_template( $pages_templates ) {
    unset( $pages_templates['page-topimage.php'] );
    unset( $pages_templates['page-home.php'] );
    return $pages_templates;
    }

endif;

关于如何让它发挥作用的任何想法?

【问题讨论】:

  • 对不起,我不是很清楚。我正在尝试阻止自定义页面模板显示在管理仪表板编辑屏幕的下拉列表中。

标签: php wordpress conditional-statements


【解决方案1】:

一些事情:

第一,您似乎只是将add_filter 调用添加到is_front_page()true 条件中,这可能是其中的一部分。

其次,您不应该if 语句中定义和/或重新定义函数!

第三,对于 WordPress,特别是它的 Action Hook and Filter 系统,通常认为最好的做法是始终添加过滤器和操作,并在函数内运行 if/else 或中止类型语句以实现更轻松的可扩展性。

编辑:

根据一些澄清,我理解得更好一些。您需要获取设置为首页的页面的 ID,该 ID 存储为选项表中名为 page_on_front 的选项。 is_front_page() 函数只能在当前$wp_query 循环的范围内工作。

我认为这会为您解决问题。在theme_page_templates 过滤器上运行je_remove_page_template 函数,并根据page_on_front 选项中存储的ID 检查当前页面的ID:

add_filter( 'theme_page_templates', 'je_remove_page_template' );
function je_remove_page_template( $pages_templates ){
    unset( $pages_templates['page-topimage.php'] );

    $home_page_id = absint( get_option( 'page_on_front' ) );
    $this_page_id = get_the_ID();

    // If this isn't the home page, remove `page-home`
    if( $this_page_id != $home_page_id ){
        unset( $pages_templates['page-home.php'] );
    }

    return $pages_templates;
}

另外值得注意的是is_front_page()is_home() 不同 - 请确保您使用的是正确的! (我相信你是,通常 IFP 是人们想要的)

【讨论】:

  • 谢谢你,但它对我不起作用。从我读过的内容来看,我认为 IFP 需要某种循环或另一个钩子来加载它。
  • 您能否在同一个函数中执行var_dump( is_front_page() ); 并查看它在各个页面上返回的内容?另外,这是针对 post_type page 的,对吗?
  • 对于 post_type 页面是。因为这是在页面编辑屏幕上使用页面模板,所以需要额外的东西来确定 IFP 是否存在。
  • var_dump 在所有页面上都返回 false,即使在我设置为首页的页面上也是如此。
  • 哦,对不起,我不太明白我想的问题。但是是的,你是对的,is_front_page() 和类似的功能只在当前循环的范围内工作,看看你是否活跃在网站的首页。我已经更新了答案,以向您展示如何将当前页面的 ID 与设置在首页的 ID 进行比较。那应该会更好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2011-12-11
  • 2015-05-07
  • 2011-12-28
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
相关资源
最近更新 更多