如何在WordPress或PHP中读取配置文件

时间:2013-03-24 作者:Umesh Awasthi

我不确定这有多重要,我正在使用基于Java的web应用程序,所以在某些情况下,我们需要定义一些可以在整个web应用程序中使用的属性,如

我们倾向于定义一个具有扩展名的属性文件。属性和JAVA API提供了一种读取此文件的方法,我们只需将密钥名称传递给API,它就会返回值。

在使用Wordpress API时,我需要有这样的用例,以便定义这样的属性,以便在需要这些值的地方读取它们,我知道Wordpress从其配置文件读取数据,但不确定如何读取。

这就是我正在尝试的

在我的主题文件夹中定义一个文件,比如customProperties,在文件中定义一些键值对,然后在需要的地方传递键值,它应该返回与之相关的值。

我相信这可以在DB的帮助下完成,但我正在寻找基于文件的方法。对我来说,一个相关的选择是在我的主题中定义那些function.php 文件

有关于这个的指针吗?

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

您当然可以将这些值定义为PHP constants 和/或全局变量,例如,函数。php

我知道,在这一点上,您宁愿使用“基于文件的方法”,而不是使用数据库,但尽管如此,我必须指出,这将是标准的,也是最好的做法。

看看WordPress Options API.

我还不太明白你是在开发插件还是主题(你已经标记了这个问题, 但在问题本身中,您谈到了主题的文件)
无论如何,选择才是出路。

SO网友:Ralf912

我知道WordPress从其配置文件中读取数据,但不确定如何读取

不,WordPress不“读取”配置,WP包括它。WordPress定义了许多全局常量(例如。WP_DEBUG ). 这个全局常量在脚本中都可以访问。您可以使用相同的方法:

$key_values = array(
  \'key_one\' => \'value_one\',
  \'key_two\' => \'value_two\',
  \'key_3\'   => 3,
);

foreach ( $key_value as $key => $value ) {
  if ( ! defined( $key ) )
    define( $key, $value );
}
在你的functions.php 将其包含在require_once \'my_propperties.php\';

但这不是首选的方式。这是有风险的,因为您必须确保没有任何键与另一个现有常量匹配。使用此解决方案,您将毒害全局命名空间。

另一种解决方案是使用单个对象。

class My_Container_For_Data
{
  public $key_one = \'value_one\';
  public $key_two = \'value_two\';

  const KEY_THREE = 3;

}

global $my_data_container;
$my_data_container = new My_Container_For_Data;
并使用访问值

global $my_data_container;
$key_one = $my_data_container->key_one;
$const_three = $my_data_container::KEY_THREE;
现在您只需确保您的类名与现有的类名不匹配。

也许您不想创建“静态”数据容器,而是想从文件中读取键值对。没问题:

<?php
/*
 * content of file data_csv.propperties:
 *
 * key_one,value_one
 * key_two,value_two
 * key_3,3
 *
 */
class My_Data_Container
{
    public static $propperties_file = \'data_csv.propperties\';

    public static $data = array();

    public function __construct() {

        // maybe add some path info to $propperties_file

        if ( empty( self::$data ) )
            $this->read_propperties();

    }

    public function __get( $key ) {

        return ( isset( self::$data[ $key ] ) ) ?
            self::$data[ $key ] : false; // or null, or trigger error, or ...

    }

    public function __set( $key = \'\', $value = null ) {

        if ( empty( $key ) )
            return false;
        else
            $key = (string) $key;

        self::$data[ $key ] = $value;

    }

    protected function read_propperties() {

        $handle = fopen( self::$propperties_file, \'r\' );

        if ( false != $handle ) {

            while ( $data = fgetcsv( $handle, 1024, \',\' ) ) {
                $this->$data[0] = $data[1];
            }

        } else {
            trigger_error( \'Could not open propperties file\', E_USER_ERROR );
        }

    }

}
在这里,我使用一个具有简单逗号分隔值的文件。其他格式(如XML)可能更好,但您必须添加一个函数来解析XML数据。

您可以在类文件中创建数据容器的实例,并使该实例成为全局实例。

require_once \'class-my_data_contaner.php\';
global $data_container;
$data_container = new My_Data_Container;

// some other file
global $data_container;
$key1 = $data_container->key_one;
或者在每次需要值时都包含该类。

require_once \'path/to/class-my_data_container.php\';
$data_container = new My_Data_Container();

$key1 = $data_container->key_one;

var_dump( $key1 );
var_dump( $data_container::$data );
在oop脚本中,自动加载器是最佳实践,您无需每次需要类的值时都考虑将其包含在内。

但总而言之,这并不是一个真正与WordPress相关的话题。在Wordpress中,您通常读取属性文件,将键/值放入数据库(如果尚未完成),然后从数据库中读取属性。如果不想在停用主题/插件后进行清理,可以使用瞬态。

结束

相关推荐

多个单个站点,一个插件目录-调整plugins_url()

[这不是一个多站点问题]更新:这个问题在逻辑上是不可能的,或者是思维循环,如果你愿意的话,请检查下面的更新。技术是laid out here in WPEngineer.它允许有一个插件文件夹来为运行在同一服务器上的多个WordPress站点提供服务。所以,我所有的开发站点都在wp配置中有这个。phpdefine( \'WP_PLUGIN_DIR\', \'/www_dev/base-site/wp-content/plugins\' ); define( \'WP_PLUGIN_URL\', \