Archivo de la categoría: PHP

Eliminación del meta tag generator a traves de un plugin de WordPress

@cmdearcos
Grupo TIECs

¿Qué es el meta tag “generator”?. En una sencilla explicación, es una etiqueta que indica con que programa se ha creado un documento, en este caso nuestro site realizado en WordPress. Si veis el código fuente de una pagína os podeis encontrar una línea como la siguiente:

  1. <meta name="generator" content="WordPress 4.2.1" />

Publicar esta infromación puede ser contraproducente, ya que permite de forma sencilla saber como está generado el site, haciendo más sencillo que puedan atacar nuestro site.

¿En que punto dice WordPress que saque esa etiqueta?. Para insertar esa etiqueta en el html, wordpress usa la función wp_generator. Esta función se incroporó en WordPress en la versión 2.5.0. La llamada a la función se hace de la siguiente forma en la línea 219 del fichero wp-includes/default-filters.php:

  1. <?php
  2.  
  3. add_action( 'wp_head', 'wp_generator');
  4.  
  5. ?>

La función add_action nos permite añadir nueva funcionalidad a wordpress. En este caso se llamará a la función wp_generator cuando se muestre el contenido entre las etiquetas <head></head> (hook wp_head).

Una primera solución sería eliminar la linea 219 del fichero wp-includes/default-filters.php, pero al actualizar las versión de wordpress los cambios en este fichero se perderían, por lo que no es una opción valida. Una opción muy recomenda es poner en el fichero functions.php la siguiente línea de código para que no se llame a la función wp_generator al cargar la cabecera:

  1. <?php
  2.  
  3. remove_action( 'wp_head', 'wp_generator' );
  4.  
  5. ?>

Si utilizas temas gratuitos que actualizas de forma automática, esta solución tiene el mismo problema que la anterior, ya que al actualizar se eliminan los cambios en functions.php. Si el tema no se va a tocar o no se va a hacer de forma autómatica esta puede ser una solución para muchos casos.

Para buscar una solución definitiva empezaremos viendo que hace la función wp_generator:

  1. <?php
  2.  
  3. function wp_generator() {
  4. /**
  5. * Filter the output of the XHTML generator tag.
  6. *
  7. * @since 2.5.0
  8. *
  9. * @param string $generator_type The XHTML generator.
  10. */
  11.    the_generator( apply_filters( 'wp_generator_type', 'xhtml' ) );
  12. }
  13.  
  14. ?>

Esta función solo llama a the_generator , crea el hook ‘wp_generator_type’ y le pasa el paramétro xhtml.

La función the_generator crea el hook ‘the_generator’ y llama a get_generator pasandole el parámetro $type (xhtml en nuestro caso):

  1. <?php
  2.  
  3. echo  apply_filters( 'the_generator', get_the_generator($type), $type ) . "\n";
  4.  
  5. ?>

Los posibles parametros que puede aceptar esta función son:

  • html
  • xhtml (la que utiliza WordPress para la cabecera).
  • atom
  • rss2
  • rdf
  • comment
  • export

Con estos parámetros se termina ejecutando este switch (en la función get_the_generator):

  1. <?php
  2.  
  3. switch ( $type ) {
  4.    case 'html':
  5.       $gen = '<meta name="generator" content="WordPress ' . get_bloginfo( 'version' ) . '">';
  6.       break;
  7.    case 'xhtml':
  8.       $gen = '<meta name="generator" content="WordPress ' . get_bloginfo( 'version' ) . '" />';
  9.       break;
  10.    case 'atom':
  11.       $gen = '<generator uri="http://wordpress.org/" version="' . get_bloginfo_rss( 'version' ) . '"&gt;WordPress&lt;/generator>';
  12.       break;
  13.    case 'rss2':
  14.       $gen = '<generator&gt;http://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . '&lt;/generator>';
  15.       break;
  16.    case 'rdf':
  17.       $gen = '<admin:generatorAgent rdf:resource="http://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . '" />';
  18.       break;
  19.    case 'comment':
  20.       $gen = '<!-- generator="WordPress/' . get_bloginfo( 'version' ) . '" -->';
  21.       break;
  22.    case 'export':
  23.       $gen = '<!-- generator="WordPress/' . get_bloginfo_rss('version') . '" created="'. date('Y-m-d H:i') . '" -->';
  24.       break;
  25. }
  26.  
  27. ?>

Con esta información la mejor opción es realizar un pequeño plugin que cambie el funcionamiento del hook the_generator de la función the_generator, de tal forma que imposibilite llamar a la función wp_generator desde otro hook diferente a wp_head. El plugin tendría el siguiente código:

  1. <?php
  2.  
  3. function eliminar_version() {
  4.    return;
  5. }
  6.  
  7. add_filter('the_generator', 'eliminar_version');
  8.  
  9. ?>

Aquí os dejo el plugin para que lo podais instalar en vuestro wordpress.

@cmdearcos
Grupo TIECs

API Rest para conocer el precio de la electricidad II

@cmdearcos
Grupo TIECs

 

Es el momento de seguir avanzando con la API Rest que iniciamos hace unos días.

Supongamos que tenemos la siguiente base datos (actualizada con los precios de enero de 2015 a fecha de hoy). Aquí os dejo un dump de la base de datos que utilizo de ejemplo en esta serie de artículos:

sql

  1. -- phpMyAdmin SQL Dump
  2. -- version 4.1.8
  3. -- http://www.phpmyadmin.net
  4. --
  5. -- Servidor: localhost
  6. -- Tiempo de generación: 31-01-2015 a las 05:30:29
  7. -- Versión del servidor: 5.5.40-36.1
  8. -- Versión de PHP: 5.4.23
  9.  
  10. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  11. SET time_zone = "+00:00";
  12.  
  13.  
  14. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  15. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  16. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  17. /*!40101 SET NAMES utf8 */;
  18.  
  19. --
  20. -- Base de datos: `mc_preciopvpc`
  21. --
  22.  
  23. -- --------------------------------------------------------
  24.  
  25. --
  26. -- Estructura de tabla para la tabla `mensual`
  27. --
  28.  
  29. CREATE TABLE IF NOT EXISTS `mensual` (
  30.   `mes` int(11) NOT NULL COMMENT 'mes del año del 1 al 12',
  31.   `año` int(11) NOT NULL COMMENT 'Año',
  32.   `precio` float NOT NULL COMMENT 'precio de la electricidad para ese mes y año',
  33.   UNIQUE KEY `mes-año` (`mes`,`año`)
  34. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  35.  
  36. --
  37. -- Volcado de datos para la tabla `mensual`
  38. --
  39.  
  40. INSERT INTO `mensual` (`mes`, `año`, `precio`) VALUES
  41. (4, 2014, 0.095084),
  42. (5, 2014, 0.110925),
  43. (6, 2014, 0.119266),
  44. (7, 2014, 0.116649),
  45. (8, 2014, 0.120844),
  46. (9, 2014, 0.130951),
  47. (10, 2014, 0.129899),
  48. (11, 2014, 0.121413),
  49. (12, 2014, 0.12238),
  50. (1, 2015, 0.128864);
  51.  
  52. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  53. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  54. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

El fichero rest.php que recoge las peticiones ha cambiado respecto al del artículo anterior en dos aspecto fundamentales:

  • Ahora le pasamos al constructor de la clase classRest el parámetro url que nos viene desde el fichero .htaccess.
  • Llamar a la función mes cuando se pide los datos de un mes.

Aquí os dejo como quedaría el fichero rest.php:

php

  1. <?php
  2. require ("classRest.php");
  3. $consulta = new classRest($_GET&#91;'url']);
  4.  
  5. $queryrest = explode("/", $_GET&#91;'url']);
  6.  
  7. switch($queryrest&#91;0]){
  8.    case 'mes':
  9.         $consulta->mes($queryrest[1],$queryrest[2]) ;
  10.         break;
  11.     case 'hora':
  12.     case 'dia':
  13.     case 'periodo':
  14.     default:
  15.         $consulta->error();
  16. }
  17. ?>

Los mayores cambios con respecto el artículo anterior esta en la clase classRest:

  • Se crea un constructor de la clase donde se inicializan valores de la clase y donde se estable la conexión con la base de datos. Es importante decir que hay controlar si se ha efectuado la conexión con la base de datos y en caso de que no se haya podido realizar (por cualquier error de un entorno de producción) se debe tratar dicho error para dar una respuesta adecuada al usuario del servicio. En este ejemplo no se hace.
  • La función urlerror ha sido sustituida por la función error sin parámetros. Esta nueva función pone la variable estado a false y publica el JSON.
  • La función publicarJSON tampoco necesita parámetro, ya que el JSON se define en la variable privada de la clase json_datos, a la que tiene acceso esta función.
  • Se crea la función mes donde se le pasa como parámetros el mes y el año y que es llamada desde rest.php. Esta función lo que hace es:
    • Comprobar que los parámetros pasados son números. Si no lo son devuelve en el JSON “Formato de fecha erróneo”.
    • Comprobar que el mes pedido no es anterior a abril de 2014, mes en el que nació el PVPC. Si se pide un mes anterior a abril de 2014 el JSON devolverá “Fecha menor de abril de 2014”.
    • Si el formato de la petición es correcta y el mes solicitado es mayor de abril de 2014 se realiza la select a la base de datos para sacar el precio que se ha cobrado del mes. Si no hay datos para ese mes el JSON devolverá el siguiente mensaje: “No hay datos para el mes $mes del año $año”, donde $mes y $año son los datos de dichas variables.
    • Si la select devuelve datos el JSON devolverá el mes, el año y el precio para la dupla mes y año.

Aquí os dejo el fichero classRest.php:

php

  1. <?php
  2. class classRest{
  3.     private $estado;
  4.     private $query;
  5.     private $json_datos;
  6.     private $gbd;
  7.    
  8.     public function __construct($url){
  9.         $this->estado = false;
  10.         $this->query = $url;
  11.         setlocale(LC_ALL, 'es_ES.UTF8');
  12.         date_default_timezone_set("Europe/Madrid");
  13.         $this->json_datos = array('estado' => $this->estado, 'fecha' => strftime("%a, %d %b %Y %T"), 'urlquery' => $this->query);
  14.         $this->gbd = new PDO('mysql:host=localhost;dbname=mibasededatos', 'miusuario', 'mipassword');
  15.     }
  16.  
  17.  
  18.     public function error(){
  19.         $this->estado = false;
  20.         $this->publicarJSON();
  21.     }
  22.    
  23.     private function publicarJSON (){
  24.         $this->json_datos['estado'] = $this->estado;
  25.         header('Content-Type: application/json');
  26.         echo json_encode($this->json_datos);        
  27.     }
  28.    
  29.     public function mes ($mes, $año){
  30.         if(!is_numeric($mes) | !is_numeric($año)){
  31.             $this->json_datos['razon_error'] = utf8_encode('Formato de fecha erróneo');
  32.             $this->error();
  33.             return;
  34.         }
  35.        
  36.         if($año < 2014 | ($mes < 4 & $año == 2014)){
  37.             $this->json_datos['razon_error'] = utf8_encode('Fecha menor de abril de 2014');
  38.             $this->error();
  39.             return;
  40.         }
  41.        
  42.         $resultado =  $this->gbd->query("select precio from mensual where año = $año AND mes = $mes;");
  43.         $datos = $resultado->fetchAll();
  44.        
  45.         if(empty($datos)){
  46.             $this->json_datos['razon_error'] = utf8_encode("No hay datos para el mes $mes del año $año");
  47.             $this->error();
  48.             return;            
  49.         }
  50.        
  51.         $this->estado = true;
  52.         $this->json_datos['datos']['m'] = $mes;
  53.         $this->json_datos['datos']['a'] = $año;
  54.         $this->json_datos['datos']['p'] = $datos[0]['precio'];
  55.        
  56.         $this->publicarJSON();
  57.     }  
  58. }
  59. ?>

Ahora voy a probar la aplicación:

http://pvpc.cmdearcos.es/mes

json mes

 

 

 

http://pvpc.cmdearcos.es/mes/3/2014

json mes-3-2014

 

 

 

http://pvpc.cmdearcos.es/mes/1/2015

json mes-1-2015

 

 

 

 

 

En próximos artículos seguiré ampliando la funcionalidad para que os pueda servir como base para vuestros propios desarrollos.

En breve publicaremos en CNomys la API Rest para que podáis descargaros todos los datos relacionados con el precio de la electricidad.

 

@cmdearcos
Grupo TIECs

API Rest para conocer el precio de la electricidad I

@cmdearcos
Grupo TIECs

 

Desde CNomys vamos a implementar una API REST para poder acceder al precio histórico de la electricidad. Aprovechando esta situación voy a realizar una serie de artículos para ayudar a todo aquel que quiera aprender a realizar un servicio REST en PHP y nunca se haya puesto con ello.

La API que vamos a realizar es solo para acceder a los datos (al menos la parte pública), no pudiéndose añadir, ni modificar, ni borrar los datos ya existentes, por lo que simplificando mucho la explicación, vamos a permitir acceder a una serie de datos a través de unas URLs que se podrán invocar por método GET.

¿Cuál es el formato que tendrán las URLs de consulta a la API?. Os pondré el ejemplo para solicitar los precios diarios del mes de enero de 2015: http://pvpc.cmdearcos.es/mes/enero/2015

Para poder tratar esta URL y dar el servicio es necesario modificar el fichero .htaccess para que redirija esta URL a nuestra API REST. Para ello es necesario poner en le fichero .htaccess las siguientes lineas:

php

  1. RewriteEngine On
  2. RewriteBase /
  3. #Si el fichero no es un directorio
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. #Si el fichero no existe
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. #Si el fichero no es un enlace
  8. RewriteCond %{REQUEST_FILENAME} !-l
  9. #Pasa la ruta desde el directorio base ($1) en la variable url al script rest.php
  10. #QSA (QSAppend) permite pasar parámetros en el QUERY STRING después de ? y separados por &amp;
  11. #NC (NoCase) hace que no distinga entre mayúsculas y minúsculas
  12. #L (Last) hace que no se ejecute ninguna instrucción después de ella
  13. RewriteRule ^(.+)$ rest.php?url=$1 [QSA,NC,L]

Una vez hecho esto podemos codificar nuestra API rest. Empezaremos viendo la primera versión del fichero resp.php:

php

  1. <?
  2. require ("classRest.php");
  3. $consulta = new classRest();
  4.  
  5. $queryrest = explode("/", $_GET&#91;'url']);
  6.  
  7. switch($queryrest&#91;0]){
  8.    case hora:
  9.     case dia:
  10.     case mes:
  11.     case periodo:
  12.     default:
  13.         $consulta->urlerror($_GET['url']);
  14. }
  15. ?>

Lo primero que hago es hacer un require del fichero classResp.php que es donde he definido la clase classResp (a continuación entraré en detalle), para posteriormente crear el objeto $consulta de dicha clase.

Luego accedemos al parámetro url, que nos han hecho llegar por método GET. Este es el parámetro que he definido en el fichero .htaccess. Hacemos un explode de dicho parámetro para tener en un array la información separada de la URL y poder tratrarla.

Lo siguiente que hacemos es consultar si el primer parametro de la url es correcto. En nuestro ejemplo mes (http://pvpc.cmdearcos.es/mes/enero/2015). En el case del mes realizaremos el tratamiento necesario para sacar los datos de un mes. En el estado actual del ejemplo no hacemos nada.

Si el primer parámetro ($queryrest[0]) no tiene tratamiento por nuestra parte (todas en el ejemplo actual) llamamos al método urlerror() de la clase classResp, pasando como parámetro la url.

Ahora es el momento de ver la clase classRest:

php

  1. <?
  2. class classRest{
  3.     private $estado = false;
  4.     private $query;
  5.    
  6.     public function urlerror($urlorig){
  7.         $json_data&#91;'estado'] = $this->estado;
  8.        setlocale(LC_ALL, 'es_ES.UTF8');
  9.  
  10.         date_default_timezone_set("Europe/Madrid");
  11.         $json_data['fecha'] = strftime("%a, %d %b %Y %T");
  12.         $json_data['urlquery'] = $urlorig;
  13.        
  14.         $this->publicarJSON(json_encode($json_data));
  15.     }
  16.    
  17.     private function publicarJSON ($json){
  18.         header('Content-Type: application/json');
  19.         echo $json;        
  20.     }
  21.    
  22. }
  23. ?>

El método urlerror() crea un array con la información de error: estado a false, fecha y hora de la petición y url. Además crea el JSON con dicho array y por último lo mando al cliente. Para que el cliente reciba correctamente un JSON es necesario cambiar la cabecera con la función header (en línea 18) para indicar que se manda un JSON en vez de HTML.

La salida, siempre que tengáis una extensión para leer JSON desde un navegador WEB, sería similar a la siguiente:

query rest

 

Aprovecho este momento para hablar de un error muy común y que suele provocar comentarios del tipo “setlocale no funciona“. Si después de utilizar setlocale se utiliza la función date para capturar la fecha/hora, ésta no tendrá el formato del idioma especificado en setlocale. Después de setlocale debéis utilizar strftime.

En siguientes artículos seguiré desde este punto para ir ampliando la funcionalidad.

 

@cmdearcos
Grupo TIECs

Migrar un blog desde B2evolution a WordPress

@cmdearcos
Grupo TIECs

 

Los que me seguís habitualmente habréis observado que ha cambiado el aspecto del blog. Pero este cambio no solo ha sido un cambio de aspecto (de plantilla) sino que ha sido un cambio mucho más profundo. He migrado el blog de b2evolution a wordpress.

Muchas son las razones para realizar este cambio, como la cantidad de plugins y plantillas existentes para wordpress. Pero la razón principal es que en las últimas semanas estoy trabajando con el mejor equipo de CMS que existe en España.

Para poder migrar de un sistema a otro lo más importante es la migración de la base de datos donde se guardan los post. Para ello he utilizado, después de adaptarlo, el script migrateb2towp creado por Justin Mazzi y modificado posteriormente por TuMahler y Alejandro Espinosa.

Lo primero que he hecho es hacer un backup de todo el site. Después he borrado (renombrado en una primera fase y una comprobado que todo estaba bien eliminando) los direcctorios y ficheros de b2evolution que estaban en el raiz del site excepto el directorio “media” que es donde estaban las fotografías (y ficheros) que utilizaba en mis post.

Posteriormente he instalado el WordPress en mi site (www.cmdearcos.es) con una nueva base de datos y he modificado el script anterior para que pase los datos de la antigua base de datos a la nueva. Para que funciones correctamente el script debes estar en el mismo directorio donde se encuentra el fichero wp-config.php.

Una vez ejecutado el script ya se puede entrar en wordpress para configurar el estilo del blog.

Aquí os dejo el script. Recordad que debéis introducir el nombre de vuestra base de datos de b2evolution y la password para que se pueda hacer la migración,

  1. <?php
  2.  
  3. //
  4. //  migrateb2towp.php
  5. //  b2evolution -> wordpress migrator
  6. //
  7. //  Created by Justin Mazzi (http://r00tshell.com)
  8. //  This script was originally found on (http://www.nocblog.com/software/2006/01/23/migrator-b2evolution-wordpress/)
  9. //  Modified by TuMahler (http://www.tumahler.com) 4/3/2006
  10. //  Modified by Alejandro Espinosa 03/01/2014
  11. //  Modified by Carlos Martín 20/07/2014
  12. //
  13. //  4/3/2006 (TuMahler):
  14. //  Updated to allow migration from B2evolution version 0.9.0.12 to Wordpress 2.02
  15. //  Also added transfer of comments and fixed a bug in the creation of posts in multiple categories
  16. //
  17. //  03/01/2014 (Alejandro Espinosa):
  18. //  Updated to work with new db structures of b2evo (version 4.1.2-stable) and WP (version 3.8, db_version 26691)
  19. //  Also added slugify function (not shure if necesary).
  20. //  Also added advise to install redirection plugin in WP in order to take care of old links
  21. //  in Google and to preserve 'google reputation' of yor posts.
  22. //  Also added advise to install WP in a subdirectory and directions on how to make it visible
  23. //  in your site root.
  24. //
  25. //  *** LIMITATIONS ***
  26. //
  27. //  This script migrates your b2evo forum to WP assuming you are in a 'one user' scenario.
  28. //  So, all posts will be imported in WP belonging to the admin user.
  29. //
  30. //  *** WARNING ***
  31. //
  32. //  This script will wipe out your wordpress posts, comments, terms, taxonomies
  33. //  and 'Term Relationships' before importing your b2evolution blog. Only
  34. //  leaves 'Uncategorized' term and related taxonomy and 'Term Relationship'.
  35. //
  36. //  *** WARNING ***
  37. //
  38. //  1) Install a fresh WP in a new directory in yor public_html. Maybe yow want WordPress
  39. //     to power your site's root (e.g. http://example.com) but you don't want all of the
  40. //     WordPress files cluttering up their root directory. WordPress allows you to install
  41. //     it into a subdirectory, but have your blog exist in the site root. Here you can
  42. //     find how to do it (after migration):
  43. //     http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory#Using_a_pre-existing_subdirectory_install
  44. //  2) Copy the following tables from b2evo db to WP db (using phpMySql):
  45. //     evo_categories, evo_items__item, evo_comments
  46. //  3) Copy this script to WP installation directory, and run it accesing it's URL.
  47. //     Read carefully the output searching for errors.
  48. //  4) Access yor WP and check over your posts, comments, users, categories etc.
  49. //  5) Install 'redirection' plugin in WP in order to take care of old links, redirecting
  50. //     them to the new ones. It is easy to do with only one 'regular espression'.
  51. //     In this way, you will conserve the 'google reputation' of your posts.
  52. //     Frecuently visit the plugin statistics to discover pages people try to access but they
  53. //     can't (404 errors), and do the convenient redirections.
  54. //  6) Enjoy your new wordpress blog
  55. //
  56. //
  57. //
  58. //
  59.  
  60. function slugify($text)
  61. {
  62.   // replace non letter or digits by -
  63.   $text = preg_replace('~[^\\pL\d]+~u', '-', $text);
  64.   // trim
  65.   $text = trim($text, '-');
  66.   // transliterate
  67.   $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
  68.   // lowercase
  69.   $text = strtolower($text);
  70.   // remove unwanted characters
  71.   $text = preg_replace('~[^-\w]+~', '', $text);
  72.   if (empty($text))  { return 'n-a'; }
  73.   return $text;
  74. }
  75.  
  76. require('wp-config.php');
  77.  
  78. $sufijowp = "wp_";
  79.  
  80.  
  81. global $wpdb;
  82.  
  83. // Use credentials defined as constants in wp-config.php:
  84. $conexionwp=mysql_connect(DB_HOST,DB_USER,DB_PASSWORD,TRUE);
  85. $conexionevo=mysql_connect(DB_HOST,'mc_demouser','demopass',TRUE);
  86.  
  87. mysql_select_db(DB_NAME,$conexionwp);
  88. mysql_select_db('mc_b2evolution',$conexionevo);
  89.  
  90.  
  91. print "<!DOCTYPE html>\n<html>\n<head>\n<title>Migrar b2evo a WordPress</title>\n";
  92. print "<meta charset=\"UTF-8\">\n</head>\n<body>\n<h1>Migrar b2evo a WordPress</h1>\n<pre>\n";
  93.  
  94. print "Borrar Comentarios...<br/>";
  95. mysql_query("DELETE FROM ".$sufijowp."comments", $conexionwp);
  96. mysql_query("ALTER TABLE ".$sufijowp."comments AUTO_INCREMENT=1", $conexionwp);
  97.  
  98. print "Borrar Posts...<br/>";
  99. mysql_query("DELETE FROM ".$sufijowp."posts", $conexionwp);
  100. mysql_query("ALTER TABLE ".$sufijowp."posts AUTO_INCREMENT=1", $conexionwp);
  101.  
  102. print "Borrar Terms...<br/>";
  103. mysql_query("DELETE FROM ".$sufijowp."terms WHERE term_id>1", $conexionwp);
  104. mysql_query("ALTER TABLE ".$sufijowp."terms AUTO_INCREMENT=2", $conexionwp);
  105.  
  106. print "Borrar Taxonomias...<br/>";
  107. mysql_query("DELETE FROM ".$sufijowp."term_taxonomy WHERE term_taxonomy_id>1", $conexionwp);
  108. mysql_query("ALTER TABLE ".$sufijowp."term_taxonomy AUTO_INCREMENT=2", $conexionwp);
  109.  
  110. print "Borrar Relaciones...<br/>";
  111. mysql_query("DELETE FROM ".$sufijowp."term_relationships WHERE object_id>1", $conexionwp);
  112. mysql_query("ALTER TABLE ".$sufijowp."term_relationships AUTO_INCREMENT=2", $conexionwp);
  113.  
  114.  
  115. print "Procesando Categorias...<br/><br/>";
  116. // post_category is no longer used in WP. Categories are now just a type
  117. // of term, and the wpterm_relationships table holds the links between
  118. // the wpposts table and the wpterm_taxonomy table (which defines terms
  119. // as part of a taxonomy.. 'category' in our case).
  120.  
  121.  
  122. $query = mysql_query("SELECT cat_ID, cat_name, cat_parent_ID as category_parent FROM evo_categories", $conexionevo);
  123. if(mysql_error()) {
  124.     print mysql_error() . "<br/>";
  125. }
  126.  
  127.  
  128. while($i = mysql_fetch_array($query)) {
  129.     print "  Importing: $i[cat_name]...\n";
  130.     $nicename = slugify(sanitize_title($i['cat_name']));
  131.     $catename = $wpdb->escape(wp_specialchars($i['cat_name']));
  132.     $query2 = "INSERT INTO ".$sufijowp."terms (term_id, name, slug) VALUES ('$i[cat_ID]', '$catename', '$nicename')";
  133.     mysql_query($query2,$conexionwp);
  134.     if(mysql_error()) {
  135.         print mysql_error() . "\n";
  136.     }
  137.     mysql_query("INSERT INTO ".$sufijowp."term_taxonomy (term_id, taxonomy) VALUES ($i[cat_ID], 'category')", $conexionwp);
  138.     if(mysql_error()) {
  139.         print mysql_error() . "\n";
  140.     }
  141. }
  142.  
  143. print "<br/><br/>";
  144.  
  145.  
  146. print "Procesando Posts...<br/><br/>";
  147.  
  148. $query = mysql_query("SELECT post_ID, post_datecreated, post_content, post_title, post_urltitle,  post_main_cat_ID, post_title as post_name, post_datemodified as post_modified_gmt, post_datemodified as post_modified FROM evo_items__item ORDER BY post_ID ASC", $conexionevo);
  149. if(mysql_error()) {
  150.     print mysql_error() . "<br/>";
  151. }
  152. while($i = mysql_fetch_array($query)) {
  153.     print "POST $i[post_ID]: \nWritting post category $i[post_main_cat_ID]...\n";
  154.     // wpterm_relationships table holds the links between the wpposts table and the
  155.     // wpterm_taxonomy table (which defines terms as part of a taxonomy, 'category' in this case).
  156.     mysql_query("INSERT INTO ".$sufijowp."term_relationships (object_id, term_taxonomy_id) VALUES ($i[post_ID], $i[post_main_cat_ID])", $conexionwp);
  157.     if(mysql_error()) {
  158.         print mysql_error() . "<br/>";
  159.     }
  160.  
  161.     $queryComment = mysql_query("SELECT count(*) as comment_count FROM `evo_comments` WHERE comment_post_ID=$i[post_ID]", $conexionevo);
  162.     $j = mysql_fetch_array($queryComment);
  163.  
  164.     foreach($i as $key=>$val) {
  165.         if ($key == "post_content")
  166.         {
  167.             $i[$key] = mysql_escape_string($val);
  168.         }
  169.         else
  170.         {
  171.             $i[$key] = mysql_escape_string($val);
  172.         }
  173.     }
  174.  
  175.     $post_content = $i[post_content];
  176.  
  177.     $post_content = $wpdb->escape($post_content);
  178.     $post_title = $wpdb->escape($i[post_title]);
  179.     $post_name = sanitize_title($i[post_urltitle]);
  180.  
  181.     print "Post_title: $i[post_title]\n";
  182.     print "Name: $i[post_name] | urltitle: $i[post_urltitle]\n";
  183.     print "Post_content:\n$i[post_content]\n\n";
  184.     $i[post_urltitle] = str_replace("aamp", "and", $i[post_urltitle]);
  185.     if(empty($i[post_name])) $i[post_name] = $i[post_urltitle];
  186.  
  187.     $query2  = "INSERT INTO ".$sufijowp."posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_status, post_name, ";
  188.     $query2 .= "post_modified_gmt, post_modified, comment_count) VALUES ('$i[post_ID]', '1', '$i[post_datecreated]', '$i[post_datecreated]', '$i[post_content]', '$i[post_name]', ";
  189.     $query2 .= "'publish', '$i[post_urltitle]', '$i[post_modified]', '$i[post_modified]', '$j[comment_count]')";
  190.  
  191.     print "Writting post...<br/>";
  192.     mysql_query($query2, $conexionwp);
  193.     if(mysql_error()) {
  194.         print mysql_error() . "<br/>";
  195.     }
  196.     print "<br/><br/><br/>";
  197.  
  198.     $j++; // Why?
  199. }
  200. print "<br/>";
  201.  
  202.  
  203. print "Procesando Comentarios...<br/>";
  204. $query = mysql_query("SELECT comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_content, comment_karma FROM evo_comments", $conexionevo);
  205. if(mysql_error()) {
  206.     print mysql_error() . "<br/>";
  207. }
  208.  
  209. while($i = mysql_fetch_array($query)) {
  210.     foreach($i as $key=>$val) {
  211.         $i[$key] = mysql_escape_string($val);
  212.     }
  213.     //$i[comment_content] = mb_convert_encoding($i[comment_content],"UTF-8");
  214.     $query2 = "INSERT INTO ".$sufijowp."comments (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_content, comment_karma) VALUES ('$i[comment_post_ID]', '$i[comment_author]', '$i[comment_author_email]', '$i[comment_author_url]', '$i[comment_author_IP]', '$i[comment_date]', '$i[comment_content]', '$i[comment_karma]')";
  215.     mysql_query($query2, $conexionwp);
  216.     if(mysql_error()) {
  217.         print mysql_error() . "<br/>";
  218.     }
  219. }
  220.  
  221. print "<br/>";
  222.  
  223. print "Processing Category Counts...<br/>";
  224.  
  225. $query = mysql_query("SELECT * FROM ".$sufijowp."terms", $conexionwp);
  226. if(mysql_error()) {
  227.     print mysql_error() . "<br/>";
  228. }
  229. while($i = mysql_fetch_array($query)) {
  230.     $query2 = mysql_query("SELECT count(*) FROM ".$sufijowp."term_relationships WHERE term_taxonomy_id = $i[term_id]", $conexionwp);
  231.     if(mysql_error()) {
  232.         print mysql_error() . "<br/>";
  233.     }
  234.     $result = mysql_fetch_array($query2);
  235.     print "$i[cat_name]: $result[0]...<br/>";
  236.     mysql_query("UPDATE ".$sufijowp."term_taxonomy set count = '$result[0]' WHERE term_id = '$i[term_id]'", $conexionwp);
  237.     if(mysql_error()) {
  238.         print mysql_error() . "<br/>";
  239.     }
  240.  
  241. }
  242. print "</pre>\n</body>\n</html>";
  243. ?>

 

 

@cmdearcos
Grupo TIECs