我的第一个 WordPress 插件

最近一周,应俱乐部技术大牛的邀请,研究了一下 WordPress 用户数据与 LDAP 服务器用户数据的关联。

话说我 PHP 还停留在去年写出第一个 PHP 脚本的水平,也不了解 LDAP 到底是怎么回事,对 WordPress 的函数什么的也都不甚了解,于是一周进度相当慢。

今天又看了一下文档,突然觉得脑袋有点清晰了,理了一下思路,写了个插件。不过很明显 bug 多多,希望各位走过路过能够给点意见,指正我的错误。

这个插件是要求 WordPress 开启多站点功能的,没开启的用起来是什么样,我还真不知道。而且由于本人折腾半天没有弄好 LDAP 服务器,于是乎只好先用 MySql 服务器替代,后面只要换掉应该就好了。

具体的功能是:另一台服务器上有一套用户数据(其他应用的,比如 UCenter 之类的,在我的插件里默认另一个应用也是 WordPress),当 WordPress 用户登陆时,数据库中没有此用户的数据,则从另一台服务器获取数据,然后在 WordPress 里建立相应的用户和站点。

假设 WordPress 数据库是 WP ,另一套用户数据存放在 WordPress 数据库中。并且假设另一 WordPress 数据库中用户密码未经加密。

这个插件有个比较大的 bug ,就是只有在总站登陆时才会自动建立,但是从二级博客登陆时就显示登录失败,具体什么原因还不知道。当然小 bug 还有很多吧,细节我都没有处理,比如数据库连接失败啊什么的。

发上来拙作,欢迎围观我一下午现学现卖的成果。

<?php
/*
 * Plugin Name: LADP USER AUTH
 * Plugin URI: http://piovano.net/
 * Version: 0.1
 * Author: WJNAN
 * Description: Just For Test
 */

//由于没有LADP服务器可用 暂时使用MySQL服务器替代

require_once(ABSPATH . WPINC . '/registration.php');

//定义变量
//LADP服务器信息
$ladpserver = "127.0.0.1";
$ladpusername = "test";
$ladppassword = "test";
//站点信息
$domain = "";
$title = "";
$email = "";

//重定义WordPress用户认证函数
if ( !function_exists('wp_authenticate') ) {
function wp_authenticate($username, $password) {
    $username = sanitize_user($username);
    $password = trim($password);

    $user = apply_filters('authenticate', null, $username, $password);

    if ( $user == null ) {
        // TODO what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
    }

    $ignore_codes = array('empty_username', 'empty_password');

    if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
        //登录失败时 连接LDAP服务器 验证用户信息
        if (ladp_authenticate( $username, $password )) {
            create_user_and_blog( $username, $password );
            $user = apply_filters('authenticate', null, $username, $password);
        }
        else 
            do_action('wp_login_failed', $username);
    }

    return $user;
}
}

//连接LADP服务器 验证用户是否存在
function ladp_authenticate($username, $password) {
    global $ladpserver;
    global $ladpusername;
    global $ladppassword;
    global $email;
    
    $sql = mysql_connect( $ladpserver, $ladpusername, $ladppassword );
    mysql_select_db( "wordpress", $sql);
    mysql_query("SET NAMES 'utf8'", $sql);
    $sqlresult = mysql_query("SELECT user_email FROM wp_users WHERE user_login='".$username."' AND user_pass='".$password."'", $sql);
    $resultarray = mysql_fetch_array( $sqlresult, MYSQL_ASSOC );
    mysql_close( $sql );
    if ( !($resultarray == NULL) ) {
        $email = $resultarray["user_email"];
        return True;
    } else
        return False;
}

//建立用户和博客
function create_user_and_blog( $username, $password ){
    global $email;
    global $domain;
    global $title;
    
    global $base;
    global $wpdb;
    global $current_site;
    
    //建立用户
    if ( empty($username) && empty($email) )
        wp_die( __( '用户名和邮箱为空。' ) );
    elseif ( empty($username) )
        wp_die( __( '用户名为空。' ) );
    elseif ( empty($email) )
        wp_die( __( '邮箱为空。' ) );
    $user_id = wpmu_create_user( esc_html( strtolower( $username ) ), $password, esc_html( $email ) );
    if ( false == $user_id )
        wp_die( __( '用户名或邮箱已被使用。' ) );
    
    //添加博客
    $domain = strtolower( $username ); //此处使用用户名作为子域名 不知道会不会有格式问题
    $title = strtolower( $username );
    $email = sanitize_email( $email );
    
    if ( ! is_subdomain_install() ) {
        $subdirectory_reserved_names = apply_filters( 'subdirectory_reserved_names', array( 'page', 'comments', 'blog', 'files', 'feed' ) );
        if ( in_array( $domain, $subdirectory_reserved_names ) )
            wp_die( sprintf( __('以下为 WordPress 保留字,不能用作博客名称: <code>%s</code>' ), implode( '</code>, <code>', $subdirectory_reserved_names ) ) );
    }
    if ( empty( $domain ) )
        wp_die( __( '站点地址为空或无效。' ) );
    if ( empty( $email ) )
        wp_die( __( '邮箱地址无效。' ) );
    if ( !is_email( $email ) )
        wp_die( __( '邮箱地址无效。' ) );
    
    if ( is_subdomain_install() ) {
        $newdomain = $domain . '.' . preg_replace( '|^www\.|', '', $current_site->domain );
        $path = $base;
    } else {
        $newdomain = $current_site->domain;
        $path = $base . $domain . '/';
    }
    
    $wpdb->hide_errors();
    $id = wpmu_create_blog( $newdomain, $path, $title, $user_id , array( 'public' => 1 ), $current_site->id );
    $wpdb->show_errors();
    if ( !is_wp_error( $id ) ) {
        $dashboard_blog = get_dashboard_blog();
        if ( !is_super_admin( $user_id ) && get_user_option( 'primary_blog', $user_id ) == $dashboard_blog->blog_id )
            update_user_option( $user_id, 'primary_blog', $id, true );
        $content_mail = sprintf( __( "新站点由 %1s 建立\n\n地址: http://%2s\n名称: %3s"), $current_user->user_login , $newdomain . $path, stripslashes( $title ) );
        wp_mail( get_site_option('admin_email'),  sprintf( __( '新站点建立:[%s]' ), $current_site->site_name ), $content_mail, '来自: "站点管理员" <' . get_site_option( 'admin_email' ) . '>' );
        wpmu_welcome_notification( $id, $user_id, $password, $title, array( 'public' => 1 ) );
        //此处重定向后 就得重新登录一次 故注释掉
        //wp_redirect( $path );
        //exit();
    } else {
        wp_die( $id->get_error_message() );
    }
}
?>

我的第一个 WordPress 插件》有2个想法

评论已关闭。