在插件中创建自定义模板并将其显示在帖子模板部分?

时间:2013-11-19 作者:jogesh_pi

现在,我正在根据我的一个客户的需要开发一个插件。但我希望插件包含所有功能本身,包括自定义模板。我的意思是我的插件包含自定义模板,但我不知道模板是否显示在管理帖子/页面部分。

是否可以通过插件在管理帖子/页面部分显示自定义模板?如果是,那么如何?非常感谢您的帮助。

更新:

我使用旧方法实现了这一点,比如为我的插件创建一个单独的自定义模板,以便管理员可以为所需插件选择模板。我不想为我的客户端提供两个单独的文件,一个用于插件,另一个用于主题:(

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

页面模板仅限于设计主题。页面模板属于表示层,而插件应该做非常有限和集中的表示,因为它们不能“知道”其输出的表示含义。

但是,如果必须在插件中执行此操作,更好的方法是在页面编辑屏幕中添加另一个框,用户可以在该框中选择使用插件的temlate,将值存储在元数据中,并执行以下操作

add_filter(\'page_template\',\'wpse1223720_template\');

function wpse1223720_template($temlate) {
  global $post;

  if (get_post_meta($post->ID,your telmlate meta key) == \'use my temlate\')
    return the path to your template file.
  else 
   return $template;
}
根本没有测试过。如果所提供的内容是一个页面,此代码会中断查找要使用的适当模板文件的代码,并使wordpress使用您自己的模板,而不是与该页面关联的模板。

另一种方法是在template\\u重定向操作上运行钩子,然后“手动”运行模板。你可以在这里看到并举例说明https://stackoverflow.com/questions/4647604/wp-use-file-in-plugin-directory-as-custom-page-template

SO网友:Lucio Coire Galibone

模板通常被降级为主题开发,用于提供布局和演示,这正是主题要提供的内容。

但是,您可以在插件激活时向主题添加模板文件。您可以挂接插件激活(和停用)

register_activation_hook($filename, \'myPluginActivation\');
register_deactivation_hook($filename, \'myPluginDeactivation\');
并使用在主题目录中手动创建模板文件fopen() fwrite() fclose() (记住在插件停用时删除创建的文件)。

该战略的关键问题是:

如果用户更改主题模板文件未移动到新的主题目录,则不会对文件操作进行错误处理,您要创建的文件可能已经存在如果您不需要在客户端保留模板选择,则可以使用template redirect hook 并使用plugin dir中的模板手动重定向默认模板。

add_action("template_redirect", \'my_theme_redirect\');

function my_theme_redirect() {
  $plugindir = dirname( __FILE__ );
  $return_template = $plugindir . \'/themefiles/\' . $templatefilename;
  do_theme_redirect($return_template);
}
这样,当插件被激活时,就可以覆盖默认模板。就我个人而言,我会使用该插件为该帖子类型创建自定义帖子类型和重定向策略,检查主题目录中是否已经存在自定义帖子类型模板,以便在主题目录中创建自定义帖子类型模板。

您可以在中找到有用的信息this Tom McFarlin article

结束

相关推荐

Security and Must Use Plugins

从codex article 必须使用插件:只需将文件上载到mu插件目录即可启用,无需登录我觉得这是一个潜在的安全问题。在站点上运行插件中的任何代码之前,必须通过管理面板激活常规插件。我一直认为这是一个明智的安全预防措施,因为攻击者如果能够以某种方式将文件上载到plugins文件夹,则在运行代码之前,还必须访问和修改数据库。这个mu-plugins 文件夹似乎提供了一种简单的方法来避免这种情况。我知道WordPress开发人员比我更了解安全性,所以我想知道是否有人能解释为什么这不是一个安全漏洞。