
La verdad es que estoy bastante enamorado de wordpress ultimamente, me gusta mucho la facilidad de actualizarse, cambiar de temas, customizarlos y la instalación de plugins que le dan una gran potencia a este sistema de blogs, pero también es verdad que a nivel empresarial, el hecho de tener un sistema de gestion de usuarios externo complica las cosas, sobre todo para los encargados de usar el blog.
No hay nada peor en una empresa que tener varios sistemas independientes entre ellos y ademas que los usuarios tengan que estar recordando usuarios y contraseñas en cada sistema, y que un cambio de contraseña en un sitio no afecte a los demás, y viceversa.
Por ello me puse a investigar y ví varias paginas dónde explicaban cómo autentificarnos en wordpress con el usuario y contraseña de otro servico.
Despues de varias pruebas y modificaciones, conseguí que funcionase, puesto que algunos códigos que encontré no eran compatibles o directamente no funcionaban correctamente (almenos no conseguía que funcionasen), decidí montarlo yo mismo a partir de lo que iva viendo. Como es la primera vez que me he puesto a tocar un plugin en wordpress, he ido bastante lento y seguramente que habrán maneras mejores de hacerlo, pero ahí va mi propuesta.
Este código esta basado en el plugin External DB authentication
La idea es muy sencilla, cuando un usuario se identifica en el panel de administración de wordpress, capturamos el login, y comprobamos en nuestro sistema si ese login es correcto y puede acceder al blog. Si es así actualizamos el usuario en wordpress con los datos del usuario en nuestro sistema, así cuando wordpress intente loguear al usuario se lo encontrará en la tabla con los datos correctos.
Para ello crearemos un fichero en la carpeta /wp-content/plugins. Podemos llamarlo “customAuthenticate.php”. Es básico que incluyamos la siguiente información al principio del archivo (almenos es lo que creo que se ha de hacer):
/* Plugin Name: Custom Authentication System Plugin URI: http://blog.davidrojo.es/2011/06/custom-login-en-wordpress/ Description: This plugin allows to customize Login process with a personal system. Version: 1.0 Author: David Rojo Author URI: http://www.davidrojo.es License: GPL2 */
Lógicamente podeis poner aquí la información que queráis. Una vez creado este archivo, si vamos al menú de plugins de wordpress, nos aparecerá nuestro plugin para activarlo.
A continuación en nuestro fichero capturaremos el proceso de autentificación de wordpress:
add_filter('wp_authenticate', 'customAuthentication', 1, 2 ); function customAuthentication( $username, $password) { }
Y ahora tenemos simplemente que programar nuestro login dentro de la función customAuthentication. El resultado seria algo similar a lo siguiente:
add_filter('wp_authenticate', 'customAuthentication', 1, 2 ); function customAuthentication( $username, $password) { $user = p_obtenerUsuario($username, $password); if ($user){ // HEMOS ENCONTRADO EL USUARIO EN NUESTRO SISTEMA $userarray['user_login'] = $user["username"]; $userarray['user_pass'] = $password; $userarray['first_name'] = $user["nombre"]; $userarray['last_name'] = $user["apelildos"]; $userarray['user_email'] = $user["email"];</pre> // COMPROBAMOS SI EL USUARIO YA ESTÁ EN WORDPRESS if ($id = username_exists($username)) { // ACTUALIZAMOS EL USUARIO EN WORDPRESS $userarray['ID'] = $id; wp_update_user($userarray); } else{ // INSERTAMOS EL USUARIO EN WORDPRESS wp_insert_user($userarray);</pre> } } else{ // USUARIO INCORRECTO remove_action('authenticate', 'wp_authenticate_username_password', 20); } }
Ahora solo nos queda programar la función p_obtenerUsuario, en la cual deberemos devolver NULL o false si el usuario no existe o su contraseña es incorrecta, en caso contrario deberemos devolver los datos del usuario como un array asociativo, con los datos necesarios para insertar el usuario en wordpress tal y como se ve en el paso anterior.
En nuestro caso vamos a conectar a una base de datos donde hay una tabla de usuarios con sus contraseñas en md5 y una columna blog indica si el usuario puede acceder al blog, asumiermos que tambien tiene las columnas username, nombre, apellidos y email. Si estas columnas tuviesen otro nombre, o estuvieran en otra tabla, se deberia hacer un mapeo para devolverlo correctamente, o cambiar en el paso anterior los nombres de las claves del array asociativo $user.
function p_obtenerUsuario($username, $password){ $mydb = new wpdb(DB_USER, DB_PASS, DB_NAME, DB_HOST); $r = $mydb->get_row( $mydb->prepare( "SELECT * FROM usuarios WHERE username = %s AND pass = %s AND blog = 1", $username, md5($password)), ARRAY_A); return $r; }
Lógicamente se deba cambiar DB_USER, DB_PASS, DB_NAME y DB_HOST por las credenciales de la base de datos a donde vayamos a conectar.
Por último deberíamos desactivar todas las opciones de recordar contraseña, registro, etc, ya que ahora la gestion de usuarios se deberia hacer desde nuestro sistema alternativo. Para ello ñadiremos el siguiente código:
//disables the (useless) password reset option in WP when this plugin is enabled. function ext_db_show_password_fields() { return 0; } /* * Disable functions. Idea taken from http auth plugin. */ function disable_function_register() { $errors = new WP_Error(); $errors->add('registerdisabled', __('User registration is not available from this site, so you can\'t create an account or retrieve your password from here. See the message above.')); ?></form><br /><div id="login_error">User registration is not available from this site, so you can't create an account or retrieve your password from here. See the message above.</div> <p id="backtoblog"><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('← Back to %s'), get_bloginfo('title', 'display' )); ?></a></p> <?php exit(); } function disable_function() { $errors = new WP_Error(); $errors->add('registerdisabled', __('User registration is not available from this site, so you can\'t create an account or retrieve your password from here. See the message above.')); login_header(__('Log In'), '', $errors); ?> <p id="backtoblog"><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('← Back to %s'), get_bloginfo('title', 'display' )); ?></a></p> <?php exit(); } add_action('lost_password', 'disable_function'); add_action('user_register', 'disable_function'); add_action('register_form', 'disable_function_register'); add_action('retrieve_password', 'disable_function'); add_action('password_reset', 'disable_function'); add_filter('show_password_fields','ext_db_show_password_fields');
Con todo esto tendremos listo nuestro plugin, recordad activarlo en la seccion plugins del panel de administración de wordpress. Cualquier duda, comentario, mejora, etc, son bien recibidas.
Resultado final del plugin customAutenticate.
No se cuanto hace de este post pero me interesa por que es lo que buscaba y necesito ayuda.
Primero entender bien tu post.
Tengo http://www.misito.com y wordpress en http://www.misitio.com/wordpress.
En wordpress/wp-contens /plugins incluimos customAuthenticate.php y activamos el plugin en el panel de administrador wp.
Cuando el usuario entra en misitio.com le redirigimos al login de wp y una vez logeado en nuestra BD, también se logea automáticamente en wp y luego podemos redirigirle p. ej. a misitio/index.php
Si llamamos después a WP el usuario está logeado.
Aunque el login y register sean de wp realmente se logea y registra en nuestro sistema y se copia a wp.
¿Es correcto?.
Y como podría hacerse para que se logeé en misitio.com y logearle en wp solo cuando llamemos a wp. ¿Pasandole variables $_SESSION o una cookie al login de wp?
Muchas Gracias anticipadas por tus molestias.