Archivos de Categoría: WordPress @es

Salir del modo de mantenimiento de WordPress cuando falla una actualización

Para salir del modo de mantenimiento de WordPress cuando falla una actualización es tan sencillo como eliminar el fichero .maintenance de la raíz. Arreglar el problema de la actualización es otra historia…

wordpress-maintenance-mode

Eliminar una action de WordPress en un tema hijo

Si quieres eliminar una action de WordPress en un tema hijo definido en el tema padre por ejemplo así:

function fusion_insert_og_meta() {
    ...
}
add_action( 'wp_head', 'fusion_insert_og_meta', 5 );

Es MUY importante usar el mismo valor de prioridad en caso de usar uno diferente al valor por defecto (10):

function remove_parent_actions() {
    remove_action( 'wp_head', 'fusion_insert_og_meta', 5 );
}
add_action( 'init', 'remove_parent_actions' );

wordpress

Ref: http://themeshaper.com/2009/05/25/action-hooks-wordpress-child-themes/

Usando dbDelta con WordPress para crear y alterar tablas

dbDelta se usa en WordPress para crear y alterar tablas en la base de datos y normalmente lo usarás en register_activation_hook durante el proceso de instalación de un plugin por ejemplo. Tanto si quieres crear como alterar una tabla siempre se le pasa a dbDelta una CREATE TABLE. Ella misma detecta si la tabla ya existe y hace los cambios necesarios en caso de tener que hacer una update.

430px-WP3.8-ERD

Esta función está definida en wp-admin/includes/upgrade.php y por tanto tienes que importarlo ANTES de llamar a dbDeta:

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

Pero esta función es un poco especial. No puedes pasarle cualquier sentencia CREATE TABLE. Tal y como se dice en la documentación:

  • Debes poner cada campo es su propia fila en la sentencia SQL.
  • Debes dejar dos espacios entre las palabras PRIMARY KEY y la definición de la clave primaria.
  • Debes usar la palabra clave KEY en vez de si sinónimo INDEX y debes incluir al menos una KEY.
  • No debes usar ningún apóstrofe o acento grave al definir los nombres de los campos.

Basándonos en estas premisas, la siguiente SQL no funcionaría y terminaría SILENCIOSAMENTE sin hacer nada:

global $wpdb;
$sql = "CREATE TABLE table_name(`id` int(10) NOT NULL AUTO_INCREMENT, `extra_id` int(5) NOT NULL,`username` tinytext NOT NULL);";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

Como puedes ver todos los campos están en la misma línea, no hay definida ninguna PRIMARY KEY y los campos usan acentos graves. La sentencia SQL correcta sería:

global $wpdb;
$sql = "CREATE TABLE table_name (
    id int(10) NOT NULL AUTO_INCREMENT,
    extra_id int(5) NOT NULL,
    username tinytext NOT NULL,
    PRIMARY KEY  (id,extra_id)
);";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

He usado esta PRIMARY KEY de 2 campos como ejemplo por que hay otro detalle con dbDelta: no puede haber espacios dentro de la definición de la clave primaria.

Espero que este artículo os resulte útil. Estos “errores” silenciosos son bastante difíciles de descubrir.

Borrar las revisiones antiguas de WordPress

WordPress guarda revisiones de los post, páginas, etc. a medida que los escribes. Sin casi darte cuenta puedes acabar con unas 5 o más revisiones de cada entrada. Y cada una de estas revisiones representa una entrada en la tabla de posts con el campo post_type con valor revision.

revisions

La primera cosa que se me ocurrió hacer para eliminar las revisiones antiguas fue borrar todas las entradas cuyo valor en la columna post_type fuera revision:

DELETE * FROM wp_posts WHERE post_type='revision';

Entonces, por si acaso, hice una búsqueda y vi que no estaba del todo bien. como dice Ozhaquí:

Note that the above SQL query just deletes post marked as revisions. If for some reason you associated a revision with a tag or a category that was then removed when the final post was published, you will have extra entries in other tables such as terms.

La consulta entonces tiene que ser algo así:

DELETE p, tr, c
FROM wp_posts p
LEFT JOIN wp_term_relationships tr ON (p.ID = tr.object_id)
LEFT JOIN wp_postmeta pm ON (p.ID = pm.post_id)
WHERE p.post_type = 'revision';

Nota: usa tu prefijo de tabla y ¡haz un backup antes por si acaso!

También puedes desactivar por completo la funcionalidad de revisiones (aunque no lo recomiendo) en el fichero wp-config.php:

define('WP_POST_REVISIONS', false);

O puedes limitar la cantidad de revisiones que se guarden así:

define('WP_POST_REVISIONS', 5);

Ref: http://weblogtoolscollection.com/archives/2010/09/28/deleting-wordpress-revisions/

Mostrar las consultas ejecutadas en WordPress con SAVEQUERIES

Una vez me hizo falta saber qué consultas se estaban ejecutando en WordPress. En ese momento activé en MySQL el registro de consultas para luego ver el log y así encontrar el problema y solucionarlo. Pero esa no es una solución tan fácil como la que he encontrado hoy.

Puedes añadir la siguiente línea a wp-config.php:

define( 'SAVEQUERIES', true );

Y después mostrar las consultas donde quieras con esto:

<?php
if ( current_user_can( 'administrator' ) ) {
    global $wpdb;
    echo "<pre>";
    print_r( $wpdb->queries );
    echo "</pre>";
}
?>

Al ejecutarse verás algo similar a esto:

(
    [0] => Array
        (
            [0] => SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
            [1] => 0.00034117698669434
            [2] => require('wp-blog-header.php'), require_once('wp-load.php'), require_once('wp-config.php'), require_once('wp-settings.php'), wp_not_installed, is_blog_installed, wp_load_alloptions
        )

    [1] => Array
        (
            [0] => SELECT * FROM wp_users WHERE user_login = 'admin'
            [1] => 0.00015687942504883
            [2] => require('wp-blog-header.php'), require_once('wp-load.php'), require_once('wp-config.php'), require_once('wp-settings.php'), WP->init, wp_get_current_user, get_currentuserinfo, apply_filters('determine_current_user'), call_user_func_array, wp_validate_logged_in_cookie, wp_validate_auth_cookie, get_user_by, WP_User::get_data_by
        )
...
)

Ref: http://codex.wordpress.org/Editing_wp-config.php#Save_queries_for_analysis