我是PHP的新手,我还在学习一些include / require函数是如何工作的。我正在开发一个插件,我正在尝试将主模板拆分成几个文件,以便更容易阅读/维护(如果这是个坏主意,那就是另一个讨论)。我的插件公用文件夹看起来像这样:
resources-plugin
├── includes
│ ├── class-resources-short-codes.php
│ └── index.php
├── index.php
├── public
│ └── partials
│ ├── resources-banner.php
│ ├── resources-filters.php
│ ├── resources-items.php
│ └── resources-query.php
在我的 class-resources-short-codes.php 文件中,我有三个有效的包含语句:
add_shortcode( 'example-resources-sc', function () {
// Banner
include( dirname( __FILE__ ) . "/../public/partials/resources-banner.php" );
echo "<article class='resources flex-container'>";
// Filters
include( dirname( __FILE__ ) . "/../public/partials/resources-filters.php" );
// Resources
include( dirname( __FILE__ ) . "/../public/partials/resources-items.php" );
echo "</article><!-- /resources -->";
} );
然后,在子模板 resources-filters.php 中,我有另一个应该从 resources-query.php 文件中提取HTML的包含:
<?php
// Doesn't work
// include( "./resources-query.php" );
// include( plugins_url("resources-plugin/public/partials/resources-query.php") );
// Works
//include( "resources-query.php");
include( dirname( __FILE__ ) ) . "/resources-query.php";
?>
<div class="slide-container">Other HTML here.</div>
我的问题是 - 为什么其中两种方法有效,但另外两种方法不起作用?我知道当你使用嵌套的include语句时,我对如何确定文件路径感到困惑。
PHP版本:5.3.3 Wordpress版本:4.2.2
谢谢!
答案 0 :(得分:3)
首先,如果需要,我建议只在脚本顶部使用一次dirname()。如果你查看wp-config.php,你会发现他们在第80行周围做了类似的事情:
define('ABSPATH', dirname(__FILE__) . '/');
在你的情况下,你可以这样做:
define('MYPATH', dirname(__FILE__));
add_shortcode( 'example-resources-sc', function () {
// Banner
include( MYPATH . "/../public/partials/resources-banner.php" );
echo "<article class='resources flex-container'>";
// Filters
include( MYPATH . "/../public/partials/resources-filters.php" );
// Resources
include( MYPATH . "/../public/partials/resources-items.php" );
echo "</article><!-- /resources -->";
} );
现在问你问的问题:
include( "./resources-query.php" );
这不起作用,因为默认情况下,PHP不会假设您所在的目录。奇怪的是,如果删除./
,PHP会允许您引用同一目录中的文件但是尽量避免这种情况行为,因为它只是令人困惑。
include( plugins_url("resources-plugin/public/partials/resources-query.php") );
您提供的第二个示例的问题是您尝试包含URL而不是路径。有些系统允许这样做,但默认情况下大部分都不允许。
作为一项规则,我建议始终使用绝对文件名包含文件,就像在有效的示例中一样。也许考虑像我提到的那样定义一个常量,这应该有助于确保你总是指向正确的路径。如果您需要一些错误反馈来解释问题,请考虑使用require_once
代替include
进行测试。最后考虑不要使用包含/../的路径,因为它们最终会给你带来麻烦。
幸