将参数传递给‘init’函数

时间:2018-04-09 作者:Carl Johnston

我正在尝试将一个参数传递到“init”挂钩(请参见下面的内容)。

//define post type name
$pt_name = \'post\';

//remove default wysiwyg editor
add_action(\'init\', function($pt_name) {
    $post_type = $pt_name;
    remove_post_type_support( $post_type, \'editor\');
}, 100);
看来$pt_name 未正确传递到挂钩函数。

3 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

你缺少的一件事是use (http://php.net/manual/en/functions.anonymous.php 示例#3)

您的代码看起来像

//define post type name
$pt_name = \'post\';

//remove default wysiwyg editor
add_action(\'init\', function() use ($pt_name) {
    $post_type = $pt_name;
    remove_post_type_support( $post_type, \'editor\');
}, 100);
这将让PHP知道在评估$pt_name 变量

但这只是解决方案的一部分,因为您希望对多个post类型执行此操作,因此无法将其存储在一个变量中(至少不是以非常可读和灵活的方式),因此需要额外的间接级别。

function remover_editor_from_post_type($pt_name) {
  add_action(\'init\', function() use ($pt_name) {
      $post_type = $pt_name;
      remove_post_type_support( $post_type, \'editor\');
  }, 100);
}

remover_editor_from_post_type(\'post\');
remover_editor_from_post_type(\'page\');
它之所以有效,是因为每次通话$pt_name 具有不同的上下文,PHP在每次创建闭包时都能正确地记住它。

SO网友:bueltge

这个init hook 没有参数!钩子在WordPress完成加载后但在发送任何头之前被激发。您可以交替使用closure function 自php5起。6在此挂钩上添加参数。

从核心开始,请参见the file on github.

/**
 * Fires after WordPress has finished loading but before any headers are sent.
 *
 * Most of WP is loaded at this stage, and the user is authenticated. WP continues
 * to load on the {@see \'init\'} hook that follows (e.g. widgets), and many plugins instantiate
 * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.).
 *
 * If you wish to plug an action once WP is loaded, use the {@see \'wp_loaded\'} hook below.
 *
 * @since 1.5.0
 */
do_action( \'init\' );
如果需要删除编辑器,则无需在挂钩上使用参数no。简单的移除就足够了。

//remove default wysiwyg editor
add_action( \'init\', function() {
    remove_post_type_support( \'post\', \'editor\' );
}, 100);
在增强的注释中,请参见此示例,以在闭包的帮助下添加参数-use.

//remove default wysiwyg editor
add_action( \'init\', function() use ($pt_name) {
    remove_post_type_support( $pt_name, \'editor\' );
}, 100);

SO网友:Mostafa Soufi

有一些方法可以将数据传递给函数。

METHOD 1: Use the global in the function:

//remove default wysiwyg editor
add_action(\'init\', function($pt_name) {
    global $pt_name;
    $post_type = $pt_name;
    remove_post_type_support( $post_type, \'editor\');
}, 100);

METHOD 2: Use the function:

//define post type name
function getPostTypeName($name = \'\') {
    return \'post\';
}

//remove default wysiwyg editor
add_action(\'init\', function($pt_name) {
    remove_post_type_support( getPostTypeName(), \'editor\');
}, 100);

METHOD 3: Use the object class:

class ModifyPostType{
    public $post_type_name;

    public function __construct() {
        // Set post type name
        $this->post_type_name = \'post\';

        //remove default wysiwyg editor
        add_action(\'init\', function($pt_name) {
            remove_post_type_support( $this->post_type_name, \'editor\');
        }, 100);
    }
}
我建议你最好使用方法3。

结束