我正在使用一种正确的方法在WordPress主题中使用这个类?

时间:2011-10-18 作者:chifliiiii

我正在使用一个类从自定义表中检索值,我需要在WordPress主题的不同文件中使用这些表,我不确定哪种方法是最好的。

这就是我现在上的课(不要怪我,因为我有点傻)

class Plans {

    public $free_plans;
    public $purchased_plans;

    private $free_count;
    private $purchased_count;


    public function __construct(){
        global $current_user;
        $this->user_id= $current_user->ID;
        $this->free_plans();
        $this->purchased_plans();
    }
        public function free_plans($debug=false){
        global $wpdb;
        $free_plans =  database query here;
        $this->free_count= count($free_plans);
        if($debug) $this->debug_wpdb(); 
        $this->free_plans= $free_plans;
    }

    public function purchased_plans($debug=false){
        global $wpdb;
        $plans_purchased= database query here;
        $this->purchased_count=count($plans_purchased);
        if($debug) $this->debug_wpdb(); 
        $this->purchased_plans= $plans_purchased;
    }

    private function debug_wpdb(){
        global $wpdb;
            $wpdb->show_errors();  
            $wpdb->print_error();

    }

    public function get_pplans_count(){

            return $this->purchased_count;
    }

    public function get_fplans_count(){

            return $this->free_count;
    }

    public function get_purchased_plans(){

            return $this->purchased_plans;
    }

    public function get_free_plans(){

            return $this->free_plans;
    }

}
我需要围绕我的主题(header.php、page-custom.php等)使用这些函数,我只想使用一个类实例,因为我不想每次需要一个值时都查询数据库,因为像我创建类时那样只查询两个值就够了。

现在我该把这门课叫什么?我认为通过在函数中创建类。php。。。。

$p= new Plans();
。。。。我本来可以在任何地方访问p美元,但似乎我错了。最好的方法是什么?

以我的情况为例,我需要在标题中。php

$p->get_fplans_count();
页面上的平面图。php

$p->get_purchased_plans();
等等。。。。

EDIT: 我不需要php帮助,我只想知道如何在WordPress中正确使用php类。看来我解释起来有点困惑(英语不是我的母语)真的谢谢你的帮助

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

要访问其他文件中的变量,最简单的方法就是按照Chip的建议,将变量全球化。

这与WordPress将全局变量$wpdb 在其他文件中可用。我已经看到你在给全球$wpdb 类中的变量。你需要做同样的事情。

在中创建实例时functions.php:

global $p;
$p = new Plans();
在中引用全局实例时header.php, footer.php, etc:

global $p;
$p->get_purchased_plans();
考虑到这一点,我想澄清两件事:

这不是WordPress的问题是的,你在使用WordPress。是的,您正在尝试找出如何在WordPress中使用类。但这个问题并不是专门针对WordPress的。如果您只使用PHP(即单个index.php 包含以下内容的文件header.phpfooter.php 并进行动态引用)您仍然会遇到相同的问题。

你的问题是关于variable scoping, not关于WordPress。奇普早些时候说的完全正确。我在这里解释它,而不是在一个问题中,这样你就可以解释为什么了。

当你打电话的时候$p = new Plans() 在您的functions.php 文件,您正在创建Plans 对象并将其存储在名为$p. 如果该变量是在函数中定义的(应该是这样),那么该变量是该函数的局部变量。如果它是在类中定义的,则它是该类的本地。

有时,您可能会意外地在全局范围中定义变量。。。这是PHP新手或刚刚开始面向对象编程的开发人员经常犯的错误。这本身不是一件坏事,但却是一个坏习惯。

如果需要访问直接局部作用域之外的变量,请始终always使用global 关键字使其可用。这就是说,请确保还以最小化名称冲突的方式命名全局变量。

$p 不是很独特。插件(或WordPress本身)很可能重新定义$p 作为一个实例以外的东西Plans() 后来在路上。那会打破你的主题。。。应该不惜一切代价避免!

类似于$chifiliii_plans_p 这将是一个更好的选择,因为我非常怀疑任何其他系统也会选择这个名称。

你做错了-自定义表不好

在WordPress中使用自定义表是不好的。很少有在系统中保证自定义表的情况,在使用该平台的6年中,我只遇到过1到2个理由。

如果您的主题是要分发的,请记住有些人将无法使用它。一些安全顾问建议WordPress访问数据库的用户在功能上受到限制——在许多共享系统中,它首先不能创建表。

在多站点系统中,您不仅要为一个站点添加新表,还要为每个激活主题的站点添加新表这大大增加了数据库的大小,这可能会给一些用户(虽然不是所有用户)带来问题。

如果您直接对数据库运行自定义查询,那么您需要自己承担很多安全问题。WordPress本身非常安全。。。除非您做错了什么,否则很难让恶意用户对您的系统进行SQL注入和其他攻击。如果您自己运行查询(在WP_Query API),然后您需要清理这些查询以防止恶意语句。

事实上,WordPress有一个Options API 已经

WordPress还支持Custom Post Types 用于存储自定义数据。

不要重新发明轮子。。。使用现有的工具帮助您解决问题。

2-不要在主题中包含功能

如果你在主题中加入了如此高级的功能,那你就是在为自己设置失败。如果用户停用您的主题,会发生什么情况?易于理解的突然,他们所有的自定义数据都消失了。

这个网站上已经多次提到:主题是为了提供styling 用于WordPress插件旨在提供functionality. 如果要存储自定义数据,请通过插件进行存储。使用主题可以设置该自定义数据的显示样式。

SO网友:Chip Bennett

如果需要一个变量在所有模板文件中都可用,请将其全球化,并调用它header.php:

global $p;    
$p = new Plans();
只要确保在任何你称之为全球化的地方实现全球化:

global $p;    
$p->get_fplans_count();

结束

相关推荐

在unctions.php中使用类而不是全局函数

在我看到的许多主题(包括TwentyEleven)和我在网上找到的示例中functions.php 主题的文件所有功能都在全局范围内声明。为了澄清,这是典型函数文件的外观:function my_theme_do_foo() { // ... } function my_theme_do_bar() { // ... } add_action( \'foo_hook\', \'my_theme_do_foo\' ); 在我看来,如果使用类,事情可以“封装”得更