为主题定义常量选项的最佳方式是什么?

时间:2022-01-30 作者:zoltankundi

我所说的常量选项是指主题的属性,这些属性在生产中的日常使用中不会改变,但开发人员主要出于可重用性的目的可以更改。比如自定义帖子、边栏、表单、自定义功能等。

我认为有两种可行的方法,它们都用于WordPress的核心主题和基础主题。编辑:添加了第三种方式

函数中的参数这是我用于自定义帖子等的方式,也是WordPress用于为接受参数的函数定义默认值的方法,如wp_login_form()wp_nav_menu(). 它要么是在挂接的函数中定义的变量,要么是在函数调用中定义的值。

add_action( \'init\', \'register_my_post_type\' );

function register_my_post_type() {
    $labels = array(
        \'name\' => __( \'my_post_type\' ),
        \'singular_name\' => __( \'My Post Type\' ),
        ...
    );

    $args = array(
        \'labels\' => $labels,
        \'public\' => true,
        ...
    );

    register_post_type( \'my_post_type\', $args );
}

全局register_{anything} 通过将实例添加到全局范围来工作。比如说

function register_post_type( $post_type, $args = array() ) {
    global $wp_post_types;
    ...
    // validation
 
    $post_type_object = new WP_Post_Type( $post_type, $args );
    ...
    $wp_post_types[ $post_type ] = $post_type_object;

常数最明显的例子是wp-config.php. WordPress将其用于大多数较小且非常基本的定义,例如数据库配置凭据和类似的内容define( \'ABSPATH\', __DIR__ . \'/\' );define( \'WPINC\', \'wp-includes\' );.

PHP从5.6开始就支持将数组定义为常量,因此可以定义这些参数。我认为,如果为了简单起见,可以在单独的文件中设置这些选项,那就太好了。

其他方法,如静态变量或单例类,似乎效率很低,因此它们不在表中,但我不确定常量。

那么,使用常量

define( \'MY_OPTION1\', array(
    \'key\' => \'value\'
    ...
));
然后像这样使用它们

add_action(\'init\', \'my_function\');

function my_function() {
    some_function_that_takes_args( MY_OPTION1 );
    ...
}
是个坏主意吗?如果是,正确/更好的方法是什么?

我的印象是,使用常量可能是个坏主意,尽管我不知道为什么或者有多坏。那么,在性能、可用性、异常或其他编码原则方面需要考虑哪些因素呢?

2 个回复
SO网友:Ben

通常,您应该尽量将全局变量/常量的数量保持在最低限度。如果你没有太多的选项,第三个(常量)选项可能是个好主意,但随着时间的推移,它会变得一团糟,因为你添加了越来越多的选项。

我通常做的是,将常量范围化为相应的类,如下所示const 或返回设置值的方法。例如,如果我有一个名为Book的自定义post类型,我将创建一个处理所有相关功能的类,例如注册post类型。此外,所有主题类都可以使用名称空间来避免类名冲突,但为了简单起见,我将展示不使用名称空间的示例:

class BookPost{
  const POST_TYPE = \'book\';
  
  public static function register(){
    register_post_type(self::POST_TYPE, array(\'labels\' => self::get_labels()));
  }

  public static function get_labels(){
    return array(
      \'name\' => __(\'Book\', \'MyTheme\'),
      //...
    );
  }
}
然后,您可以从类的外部或内部调用register,而不用担心参数,例如:

add_action( \'init\', \'BookPost::register\' );
如果您需要从代码中的任何其他位置访问post类型(或其他参数),您可以使用:

BookPost::POST_TYPE;
BookPost::get_labels();
这里有几件事需要提及:

因为您不能使用表达式(例如调用__() 方法)在常量中,必须使用方法来检索更动态的值,如label

BookPost::get_latest();
BookPost::get_all();
BookPost::get_by_genre();
同样在性能方面,在类中注册常量与在选项中使用数组常量应该不会有任何有意义的区别。

SO网友:rudtek

您应该查看wordpress选项页:

https://codex.wordpress.org/Creating_Options_Pages

该页面将为您创建WordPres的选项和设置提供一个良好的起点。

相关推荐

在WordPress表单上添加指向php字段文本的链接

我买了一个wordpress模板,但开发人员说他们不能帮我做我需要的。该主题集成了一个酒店预订系统,该表单为“放置”用户电子邮件提供了一个字段,但是该选项被禁用,只会显示一条文本,上面写着“需要登录”,但当我单击那里时,什么也没有发生。我想email字段至少应该把我带到一个页面(可能是用户注册),或者至少这是我希望发生的事情。我一直在查看该表单的PHP代码,但我真的不知道该怎么做,因为我不处理PHP,我不知道如何解决这个问题。我曾多次尝试通过添加a href=来解决这个问题,但什么都没有发生。有没有人可以