Configuración de blogs con Wordpress

Instalación

Descargo Wordpress de la página oficial y lo descomprimo en /var/www:

cd /var/www
wget http://wordpress.org/latest.tar.gz -O - | tar zx

Renombro la carpeta descomprimida.

mv wordpress blogs

Nota

/blogs está definido en la configuración de Apache para servirse como PHP.

Más información sobre la configuración de Apache en Configuración.

Entro en https://cactus.rufian.eu/blogs y me saldrá un asistente de instalación donde me preguntará la base de datos en la que creará sus tablas. Hago uso de la base de datos wordpress que creé en MySQL.

../_images/wordpress.png

Configuración de la red

Los pasos anteriores son suficientes para tener un blog de Wordpress, pero necesitamos una red de blogs de Wordpress.

Wordpress soporta esta funcionalidad de forma nativa, pero debe habilitarse y configurarse. No me detengo en ello y remito a la documentación oficial.

Integración con Cactus-web

Ahora ya podemos tener varios blogs y usuarios en nuestra red, cada uno con su administrador. Sin embargo, la creación de estos no puede ser manual. Los usuarios deben poder contratar el blog desde la interfaz web que está programada en Django.

Además, los usuarios deben poder logearse en sus blogs con su usuario y su contraseña.

Para este fin, he creado un plugin de Wordpress que expone la funcionalidad de creación y destrucción de usuarios y blogs en una sencilla API web y además provee un hook de autenticación que redirecciona las peticiones de autenticación a una vista Django creada al efecto.

El plugin se instala en /var/www/blogs/wp-content/plugins/cactus_auth/ y consta de los ficheros abajo descritos.

API para manipulación de blogs y usuarios de Wordpress

create_user_and_blog.php

<?php

include("config.php");

$key = $_POST['key'];
$username = $_POST['username'];
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$email = $_POST['email'];

if ($key != $auth_valid_key) {
  header('HTTP/1.1 401 Unauthorized', true, 401);
  echo("Go away.");
  exit();
}

if ($username == "" or $email == "") {
  header('HTTP/1.1 400 Bad Request', true, 400);
  echo("Username and email are needed");
  exit();
}

require_once(dirname(dirname(dirname(dirname(__FILE__)))) . '/wp-load.php');

/* Create user */
$user = get_user_by('login', $username);

if (!$user) {
  $userdata = array('user_email' => $email,
                    'user_login' => $username,
                    'first_name' => $first_name,
                    'last_name'  => $last_name,
                    );

  $new_user_id = wp_insert_user($userdata);

  $user = new WP_User($new_user_id);
}

/* Create site */
wpmu_create_blog('cactus.rufian.eu', '/blogs/'.$username, 'Blog de '.$username, $user->ID);

echo("OK");

?>

delete_user_and_blog.php

<?php

include("config.php");

$key = $_POST['key'];
$username = $_POST['username'];

if ($key != $auth_valid_key) {
  header('HTTP/1.1 401 Unauthorized', true, 401);
  echo("Go away.");
  exit();
}

require_once(dirname(dirname(dirname(dirname(__FILE__)))) . '/wp-load.php');
require_once(dirname(dirname(dirname(dirname(__FILE__)))) . '/wp-admin/includes/admin.php');

/* Delete blog */
$blog = get_blog_details($username);
if ($blog) {
  wpmu_delete_blog($blog->blog_id, true);
}

/* Delete user */
$user = get_user_by('login', $username);
if ($user) {
  wpmu_delete_user($user->ID);
}

echo("OK");

?>

Puente de autenticación entre Django y Wordpress

cactus_auth.php

<?php
/**
 * @package cactus_auth
 * @version 1.0
 */
/*
Plugin Name: Cactus Auth
Plugin URI: https://cactus.rufian.eu/
Description: Login with Cactus
Author: Juan Luis Boya García
Version: 1.0
Author URI: https://rufian.eu/
*/

add_filter('authenticate', 'do_cactus_auth', 10, 3);

function do_cactus_auth($user, $username, $password) {
  if ($username == '' || $password == '') return;

  $response = wp_remote_get("http://localhost/wp-login/".
                            "?username=".urlencode($username).
                            "&password=".urlencode($password));

  $ext_auth = json_decode($response['body'], true);

  if ($ext_auth['status'] == false) {
    $user = new WP_Error('denied', __("<strong>Error</strong>: Usuario o contraseña incorrectos."));
  } else {
    $user = get_user_by('login', $username);
    if (!$user) {
      $userdata = array('user_email' => $ext_auth['email'],
                        'user_login' => $ext_auth['username'],
                        'first_name' => $ext_auth['first_name'],
                        'last_name'  => $ext_auth['last_name'],
                      );

      $new_user_id = wp_insert_user($userdata);

      $user = new WP_User($new_user_id);
    }
  }

  if ($username != 'admin') {
    remove_action('authenticate', 'wp_authenticate_username_password', 20);
  }

  return $user;
}

?>