21ene
23

Hace bastante tiempo tuve problemas con los posts programados (ayer mismo hablábamos de este asunto). Suelo escribir según tengo el día de inspirado y no siempre publico todo el mismo día. Aquí por ejemplo, en Ayuda WordPress, suelo programar muchos posts para poder ofrecer siempre al menos un truco o guía al día, luego además publico todo aquello que sea actualidad rabiosa.

posts-programados

Pues bien, a lo que iba, tras la migración inicial de Mayo comprobé que los posts programados no terminaban de publicarse nunca, cuando llegaba la hora en que tenían que salir a la luz empezaban como un bucle infinito en el que cada vez subía el contador de tiempo que faltaba para que se publicara el post en cuestión.

Y, tras mucho investigar, di con la solución que, por supuesto, tenía que ver con algo raro que pasó en la migración. Cuando lo descubrí lo compartí en los foros de soporte de Mediatemple, pero hoy he caído en que nunca lo comenté aquí, craso error que ahora voy a solucionar.

Bien, pues el asunto es que es algo que tiene que ver con el archivo ‘wp-cron.php‘ y la configuración del servidor …

LA SOLUCIÓN

  1. Teclea el siguiente comando a través de SSH (por supuesto, debes tener acceso a tu servidor por este medio)
    wget http://tudominio.com/wp-cron.php

    Si todo está bien verás un mensaje de “OK”. Pero si hay problemas verás un feo mensaje de error 404 en la ventana del terminal. Si tienes esta mala suerte debes seguir estos pasos …

  2. Abre tu fichero ‘etc/hosts
  3. Observa si la DNS a que apunta no es la dirección DNS de tu dominio (p.ej.: si la DNS de tu domino es 75.38.40.200 y el fichero de hosts apunta a 125.0.0.3)
  4. Cambia la DNS errónea en el fichero ‘etc/hosts‘ a la DNS real de tu dominio
  5. Comprueba de nuevo si tu fichero ‘wp-cron.php‘ funciona correctamente tecleando lo mismo de antes …
    wget http://tudominio.com/wp-cron.php

    Si obtienes un “OK” ya lo tienes

También, por supuesto, te puedes encontrar en la situación en que no tengas acceso vía SSH. En ese caso siempre puedes pedir al servicio técnico de tu alojamiento que hagan esta comprobación, para eso pagas ¿no?.

Para saber más:

  • Pingback: Bitacoras.com

  • http://seofilia.com lalaale

    A veces cuando haces cambio de horario (por migraciones, horario de verano, etc) también puede verse afectada la base de datos en cuanto a esto de los post programados.

    Hay que contemplar estos cambios si uno modifica la hora por zona horaria, etc; ya que cambiamos la hora general, pero no la de los post a futuro.

  • http://rienzie.com Àngel Carrión

    Yo algunas veces tengo problemas y otras veces no… Es algo extraño porque el archivo es correcto…

    • http://geekotic.com Gabolonte Blasfemus

      A mi siempre me pasó esto, y nunca me molesté en buscarle la solución por vago y porque igual tengo que actualizar todo al WP 2.7, así que por lo general terminaba publicando los posts programados a mano entrando desde mi PDA o de donde pudiese. Gracias por la info!

  • http://www.machacas.org Sr. Cuguero

    Yo pasé por el mismo problema alojado en un hosting con acceso limitado (servage.net). Después de muchas peleas con ellos me dijeron que no podian permitir a wp-cron.php hacer tantas peticiones.
    La solución es cambiar el código de \includes\cron.php
    Se tiene que sustituir la función spawn_cron por esta:
    function spawn_cron() {
    $crons = _get_cron_array();

    if ( !is_array($crons) )
    return;

    $keys = array_keys( $crons );
    if ( array_shift( $keys ) > time() )
    return;

    $cron_url = get_option( 'siteurl' ) . '/wp-cron.php';
    $parts = parse_url( $cron_url );

    if ($parts['scheme'] == 'https') {
    // support for SSL was added in 4.3.0
    if (version_compare(phpversion(), '4.3.0', '>=') && function_exists('openssl_open')) {
    $port = isset($parts['port']) ? $parts['port'] : 443;
    $argyle = @fsockopen('ssl://' . $parts['host'], $port, $errno, $errstr, 0.01);
    } else {
    return false;
    }
    } else {
    $port = isset($parts['port']) ? $parts['port'] : 80;
    $argyle = @ fsockopen( $parts['host'], $port, $errno, $errstr, 0.01 );
    }

    if ( $argyle ) {
    fputs( $argyle,
    "GET {$parts['path']}?check=" . wp_hash('187425') . " HTTP/1.0\r\n"
    . "Host: {$_SERVER['HTTP_HOST']}\r\n\r\n"
    );
    }
    else {
    //BEGIN COPIED wp-cron.php CONTENTS
    if ( get_option('doing_cron') > time() )
    exit;

    update_option('doing_cron', time() + 30);

    $crons = _get_cron_array();
    $keys = array_keys($crons);
    if (!is_array($crons) || $keys[0] > time())
    return;

    foreach ($crons as $timestamp => $cronhooks) {
    if ($timestamp > time()) break;
    foreach ($cronhooks as $hook => $keys) {
    foreach ($keys as $key => $args) {
    $schedule = $args['schedule'];
    if ($schedule != false) {
    $new_args = array($timestamp, $schedule, $hook, $args['args']);
    call_user_func_array('wp_reschedule_event', $new_args);
    }
    wp_unschedule_event($timestamp, $hook, $args['args']);
    do_action_ref_array($hook, $args['args']);
    }
    }
    }

    update_option('doing_cron', 0);
    //END COPIED wp-cron.php CONTENTS
    }
    }

    El único problema es que tienes que volver a cambiarlo cada vez que actualizas wordpress.
    Espero que os sirva de ayuda. A mi me costó un par de dias dar con la solución

    • http://fernandotellado.com/ Fernando Tellado

      Que buena aportación, muchas gracias por compartirla :)

  • Webmaster14

    Muchas Gracias Fernando, la verdad que recién me estoy iniciando en esto de WordPress y quiero agradecerte porque tu blog realmente me solucionó la vida…

    Gracias

    • http://fernandotellado.com/ Fernando Tellado

      Gracias a ti por saber apreciarlo :)

  • Pingback: NexoGeek...Tecnología, Recursos, Cultura..y más.

  • Tonio

    Pues a mi no me ha ido bien ninguna de las opciones que dáis. Mi hosting está con Windows Server 2003, y no puedo hacer lo que comentáis en el post. También he intentado lo que comenta Sr. Ceguero y nada, me da error y no puedo ni acceder al blog. ¿Alguna solución para Windows Server porfa?
    Gracias!

  • http://www.machacas.org Sr. Cuguero

    Si no puedes entrar en el blog después de modificar el cron.php, tiene que estar mal puesto algo. ¿Que versión de wordpress tienes instalada?

  • Tonio

    Gracias por la pronta respuesta. Es la 2.7, y todo se fue al traste al actualizar.

  • http://www.machacas.org Sr. Cuguero

    Este es el archivo cron.php completo que a mi me funciona para wordpress 2.7 http://www.megaupload.com/es/?d=DGPHSYIJ
    Machácalo (antes renombra el tuyo) y comprueba que tiene los permisos bien.

    Ya contarás.

    • josue

      Sr Cuguero, puedes subir nuevamente el archivo cron.php ???

      es q ya no esta disponible en mega upload! gracias!!

  • Tonio

    Genial, sencillamente genial. A sus pies.
    No sé que haría al copiar y pegar el texto, pero no funcionaba. Ahora voy a comparar el código para ver dónde lo hacía mal yo, aunque tampoco tiene tanto secreto el copiar y pegar para que no me saliera bien.
    De nuevo muchas gracias, y excelente solución al problema, que no es precisamente pequeño. A ver qué tal cuando salga la 2.8, aunque tardaré un tiempo en probarla.
    Saludos,

  • http://www.machacas.org Sr. Cuguero

    Pues me alegro. Yo el problema lo arregle en la 2.6 y la solución me ha funcionado para todas hasta ahora.
    Un saludo.

  • http://www.diariopersonal.net Pimkie

    Hola!

    he llegado hasta este post buscando cómo solucionar problemas con los posts programados, porque tengo un problema parecido, pero ni puedo acceder a mi domino vía SSH, ni es exactamente este el problema que tengo, así que no sé si te habrá ocurrido o sabrás de alguien a quien le ocurra algo parecido.

    En mi caso, lo que ocurre es que dejo el post programado, no se publica, y el lado de la fecha en que tendría que haberse publicado, aparece un texto en naranja “fecha pasado”, y el estado “scheduled”.

    No consigo encontrar la solución, y no sé de nadie a quien le haya pasado. Tu post es lo más parecido que he encontrado, pero no es exactamente el mismo problema y no sé qué hacer, así que no sé si podrías echarme una mano hoygan! Grasias de antebraso ;)

  • Tonio

    Hola Pimkie. Según comentas lo que te sucede es lo que me pasaba a mi. Yo lo solucioné con el archivo que aportó el Sr. Ceguero. Prueba a usarlo y si sigue sin ir vuelve a postear a ver si entre todos podemos hacer algo.
    Un saludo

  • http://www.machacas.org Cug

    No me había dado cuenta que lo habían eliminado. os lo dejo otra vez por si aún es una solución válida. http://www.megaupload.com/?d=CY9W9JQ8

  • http://www.diariopersonal.net Pimkie

    Actualicé a la versión 2.8 de wordpress y funciona si le pongo la hora, programo y no lo vuelvo a tocar, pero si por algún motivo me equivoco en la hora, y edito el post para modificarla, entonces sigue fallando. A ver si en la versión 2.8.1. se soluciona.

    Gracias a todos!

  • Pingback: Entrada programadas que no se publican | Ayuda WordPress

  • mmedia

    Pues a mi me sigue dando problemas a pesar de que la consulta me devuelve el OK:

    HTTP request sent, awaiting response… 200 OK

  • Sasmich

    Buenas que tal, he llegado a este post buscando alguna solución ya que los post programados no los publica, he probado de todo, reinstalar wordpress, revisar mediante el ssh el cron.php, limpiar la base de datos, todo lo que se me ha ocurrido, pero nada. A pesar de todo intento publicarla “a mano” si edito la entrada en el estado no me aparece publicar, para ello le doy a edición rápida, donde si me aparece el estado, pero a pesar de cambiar el estado hace caso omiso y no publica.

    Para publicar el post, tengo que eliminarlo y volver a crearlo, a ver si alguien se le ocurre alguna solución, lo curioso es que hace varios días si funcionaba sin problemas. No he probado el codigo más arriba ya que no se si es compatible con la versión de wp que utilizo 3.3.1

    Gracias y un saludo