在管理中使用REQUIRED_ONCE()

时间:2012-02-10 作者:Philip Downer

在我的主题目录中,我有以下结构:

/包括/功能自定义。php包括/avatax/avatax。php包括/类/GMAP。班php

我正在从函数自定义打电话。php使用以下代码在WordPress管理中包含第二个文件

require_once(\'avatax/AvaTax.php\'); //Avalara Sales Tax API
if ( is_admin() ) {
    require_once(\'classes/gmaps.class.php\');
}
第一个要求适用于主题和管理员。第二个显然只适用于管理员。但是,第一个require失败,并显示以下消息:

Warning: require_once(/Users/philipdowner/Sites/dms/wp-content/themes/dms/includes/avatax/classes/BatchSvc/WP_User_Search.class.php) [function.require-once]: failed to open stream: No such file or directory in /Users/philipdowner/Sites/dms/wp-content/themes/dms/includes/avatax/AvaTax.php on line 23

Fatal error: require_once() [function.require]: Failed opening required \'/Users/philipdowner/Sites/dms/wp-content/themes/dms/includes/avatax/classes/BatchSvc/WP_User_Search.class.php\' (include_path=\'.:/Applications/MAMP/bin/php5/lib/php\') in /Users/philipdowner/Sites/dms/wp-content/themes/dms/includes/avatax/AvaTax.php on line 23
我觉得这不应该是个难缠的人。也许我忽略了一些显而易见的事情?我尝试过在文件路径之前使用常量“TEMPLATEPATH”,并使用明显的WordPress函数,如

require_once(get_template_directory().\'/path/to/file\');
我正在本地开发MAMP。特别奇怪的是调用文件(在错误消息中)“/classes/BatchSvc/WP\\u User\\u Search”。班php’。

有人能帮忙吗?

4 个回复
最合适的回答,由SO网友:Philip Downer 整理而成

因此,经过一个晚上的睡眠,以及上述用户确认我正确地包含了文件后,我成功地解决了这个问题。

在《阿凡达》中。php文件中,有一个\\uu autoload()函数:

<?php
function __autoload($class_name) 
{   

if ( $class_name != \'WP_User_Search\' ) { //WORDPRESS HACK
    $path=dirname(__FILE__).\'/classes/\'.$class_name . \'.class.php\';

    if(!file_exists($path))
    {
        $path=dirname(__FILE__).\'/classes/BatchSvc/\'.$class_name . \'.class.php\';

    }

    require_once $path;
}


}
?>
正在向函数传递WordPress-$class\\u name中的变量。我不完全确定变量来自哪里,但可能会转储$\\u GLOBALS或$wp\\u查询并找到答案。我基本上已经确保(破解)了该函数,以确保传递的变量与字符串“WP\\u User\\u Search”不匹配。

至于我的include文件,我使用了以下代码:

<?php
define(\'INCLUDE_PATH\', get_template_directory().\'/includes\');
require_once(INCLUDE_PATH.\'/avatax/AvaTax.php\'); //Avalara Sales Tax API
if ( is_admin() ) {
require_once(INCLUDE_PATH.\'/classes/gmaps.class.php\');
}
?>
谢谢你帮我解决这个问题,伙计们!

SO网友:kaiser

避免使用原生php函数,因为它们不是相对的,所以很容易破坏。(就像在OPs案例中)如果core为您提供了功能,为什么要扮演您自己的角色
  • 他们不考虑边缘情况
  • 您不应该使用常量

    • STYLESHEET_DIRECTORY
    • TEMPLATE_DIRECTORY
    • WP_PLUGIN_DIR

      但应使用以下API函数:

      父主题:get_template_directory() / get_template_directory_uri()get_stylesheet_directory() / get_stylesheet_directory_uri()

    您可以在插件和主题中使用:

    • plugin_dir_path(__FILE__).\'/your/path/to/file.ext <主题也包括plugin_dir_url( __FILE__ ).\'/your/path/to/file.ext plugin_dir_url() 仅为插件保留。

      请记住

      通过注册的目录中的主题register_theme_directory( $dir );wp_upload_dir();, content_url();, 等

      总的来说:看看/wp-includes/link-template.php 对于一大堆与路径和URl相关的API函数。

    SO网友:mor7ifer

    看起来需要从内部调用AvaTax.php, 所以如果你把电话改成../classes/gmaps.class.php (英寸AvaTax.php, 不在functions-custom.php) 它应该修复错误。

    SO网友:D.A.H

    Manifestphil, 如果您使用WordPress Autoloader,就不必担心加载类的文件。当然,您必须在这种情况下编写干净的类文件,这也使您的代码更易于管理。

    简单步骤:

    在主题根文件夹中创建文件夹/库要避免相同类名的问题,请使用namespaces 并创建appropriate folders structure例如,要加载类MyNameSpace\\MyClass,您需要如下所示的文件夹结构:

    /mytheme
       /lib
          /MyNameSpace
             /MyClass.php
    
    如果初始化新对象或调用某些方法等,则会自动加载类文件。此外,它还可以与任何WordPress挂钩方法配合使用,例如:

    add_action ( \'admin_menu\', \'MyNameSpace\\MyClass::AddSomeToolsMenu\' );
    
    在上面的case中,仅当实际需要并由WordPress调用时才加载类:)

    结束