2

我正在使用user_register写入变量的钩子$user_id。我想在函数内部调用这个钩子并将变量$pass从父函数传递给函数register_pass。一旦到达那里,$passuser_id根据他们的协议发送到第三方软件。

关键目标是让两者都$pass进入$user_id同一个数组以通过 SOAP 发送出去。

function random_pass_save($pass){

    add_action( 'user_register', 'regiser_pass')
    function register_pass($user_id){
        .
        .
        .
        code that processes both the $user_id, AND $pass and sends it to another piece of software
        .
        .
        .
    }

}

现在我已经对此进行了一些阅读,并且我一直有人建议使用类将变量从 add_action 调用传递到父函数等等。原则上这是有道理的;据我了解,您几乎可以在任何地方访问该类(有点像全局变量,但不那么不稳定)。但是,我只是不明白如何将我看到的示例应用于我的情况。我以前没有使用过课程,所以我想知道是否有人愿意引导我完成这个特定的应用程序。

4

2 回答 2

3

如果我理解这一点,您只需要在创建用户时调用自定义函数。这些函数不必嵌套,这是否是一个类也没关系。

添加钩子并在其回调中,调用传递数据的函数:

add_action( 'user_register', 'register_pass' );

function register_pass( $user_id )
{
    $password = get_the_password_somehow_with( $user_id ); // <--- problem
    random_pass_save( $user_id, $password );
}

function random_pass_save( $user_id, $password )
{
    // do your thing
}

这个问题可以用 hook 来解​​决check_passwords,它发生在之前user_register并且包含用户名和密码。

但是好的,让我们在一个类中进行,它基于我一直使用的这个骨架。所有的解释都在代码注释中。

<?php
/**
 * Plugin Name: Testing a Singleton
 * Plugin URI:  http://stackoverflow.com/questions/19306582
 * Version:     0.1
 * Author:      brasofilo 
 * Author URI:  http://wordpress.stackexchange.com/users/12615/brasofilo
 */

# Start the plugin in a safe point
add_action( 
    'plugins_loaded',
    array( B5F_Demo_SO_19306582::get_instance(), 'plugin_setup' )
    );

class B5F_Demo_SO_19306582 
{
    # Singleton
    protected static $instance = NULL;  

    # Store new user data (id, name, password)
    private $user_data;  

    # Leave empty
    public function __construct() {}

    # Singleton
    public static function get_instance() 
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    # Start our action hooks
    public function plugin_setup() 
    {
        add_action( 'check_passwords', array( $this, 'check_pass' ), 10, 3 );
        add_action( 'user_register',  array( $this, 'user_register_action' ) );
    }

    # Confirms that passwords match when registering a new user
    public function check_pass( $user, $pass1, $pass2 ) 
    {   
        // They match, let's add data to our private property
        if( $pass1 == $pass2 )
            $this->user_data = array( 'user' => $user, 'pass' => $pass1 );
    }

    # Add the ID of a newly registered user to our private property
    # Now we have all the data and can call our final method
    public function user_register_action( $user_id )
    {
        $this->user_data['user_id'] = $user_id;
        $this->external_save();
    }

    # In this method we do our thing with all the information 
    # previously stored in the private property
    public function external_save()
    {
        var_dump( $this->user_data );
        die();
    }
}
于 2013-10-11T02:44:29.863 回答
2

您不需要函数中的函数;正如其他人所说,您可以通过课程来完成此任务。

我建议阅读单例模式。基本上,您需要一个保证只存在一个自身实例的对象。因此,假设您用来存储新用户信息的类称为 UserCredentials。一旦它被实现为单例,以及适当的用户/通行证的获取器/设置器,您可以执行以下操作:

function random_pass_save($pass) {
    UserCredentials::getSingleton()->savePass($pass);
}

add_action( 'user_register', 'regiser_pass')
function register_pass($user_id){
    $pass = UserCredentials::getSingleton()->getPass();
    // $user_id and $pass are now both in scope
}

正如你所推断的,同样的事情可以通过存储到 $GLOBALS['whatever'] 来完成,但这更干净。

于 2013-10-11T00:24:30.640 回答