如何使对象在整个站点上可用?

时间:2017-04-27 作者:lz430

我有一个定制的WP表,我查询它以获取一个值数组。我需要的是使这些变量存在于整个WP站点中。

我不知道最好的方法是什么。以下是我的功能:

function get_dealer_info(){
  global $wpdb;
  $table_name = $wpdb->prefix . "dealer_info";
  $dealerInfo = $wpdb->get_results( "SELECT * FROM $table_name" );

  return $dealerInfo;
}
global $dealerInfo;
add_action(\'init\', \'get_dealer_info\');
所以我想用这个

echo $dealerInfo[\'field1\']; 
或者类似的东西。这有意义吗?

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

不要使用全局变量。曾经

don\'t need 你的目标无处不在。只有在代码运行的地方才需要它改为使用回调对象方法。

此类类的简单示例:

class DealerInfo
{
    /**
     * @var \\wpdb
     */
    private $wpdb;

    private $table_name = \'\';

    private $results = [];

    public function __construct( \\wpdb $wpdb, $table_name )
    {
        $this->wpdb       = $wpdb;
        $this->table_name = $table_name;
    }

    public function entry( $id )
    {
        if ( empty( $this->results ) )
            $this->fetch();

        if ( empty( $this->results[ $id ] ) )
            return [];

        return $this->results[ $id ];
    }

    private function fetch()
    {
        $full_table_name = $this->wpdb->prefix . $this->table_name;
        $this->results   = $this->wpdb->get_results( "SELECT * FROM $full_table_name" );
    }
}
现在您可以提前设置该类,例如wp_loaded, 并将获取条目详细信息的方法注册为回调…

add_action( \'wp_loaded\', function() {

    global $wpdb;

    $dealer_info = new DealerInfo( $wpdb, \'dealer_info\' );

    add_filter( \'show_dealer_details\', [ $dealer_info, \'entry\' ] );
});
…以及您要使用的位置echo $dealerInfo[\'field1\'];, 您现在可以使用:

// 4 is the dealer id in the database
$dealer_details = apply_filters( \'show_dealer_details\', [], 4 );

if ( ! empty( $dealer_details ) )
{
    // print the details
}
当然,除了WP-hook-API之外,所有东西都被很好地隔离了。

SO网友:somebodysomewhere

注意你的函数是如何全球化的$wpdb? 这是因为在WP核心的其他地方,他们创建了一个名为$wpdb. 现在,当您需要使用$wpdb 在其自然范围之外,您可以编写global $wpdb; 在您需要的地方提供。

您可以对自己的变量执行相同的操作。在您的功能中。php,您可以$dealerInfo = get_dealer_info(); 如果你需要使用它,你可以打电话global $dealerInfo; 那就随心所欲地使用它吧。

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请