Eliminar publicaciones de un tipo de publicación automáticamente a través de Cron

3

¿Cómo puedo usar Cron para eliminar publicaciones de un determinado tipo de publicación una vez que alcanzan un cierto límite, como mantener un máximo de 50 publicaciones?

El motivo es que estas publicaciones se importan automáticamente de forma periódica, por lo que quiero evitar que la base de datos sea demasiado grande, aparte del hecho de que las publicaciones anteriores no serán necesarias.

    
pregunta urok93 22.08.2012 - 10:24

2 respuestas

13

Aunque no entiendo la motivación para truncar las publicaciones, creo que este ejercicio es valioso para que entiendas cómo usar cron + WordPress.

Crear una función para truncar publicaciones

Esto se puede usar para los dos métodos siguientes: WP-cron o UNIX cron.

function foobar_truncate_posts(){
    global $wpdb;

    # Set your threshold of max posts and post_type name
    $threshold = 50;
    $post_type = 'foobar';

    # Query post type
    $query = "
        SELECT ID FROM $wpdb->posts 
        WHERE post_type = '$post_type' 
        AND post_status = 'publish' 
        ORDER BY post_modified DESC
    ";
    $results = $wpdb->get_results($query);

    # Check if there are any results
    if(count($results)){
        foreach($result as $post){
            $i++;

            # Skip any posts within our threshold
            if($i <= $threshold)
                continue;

            # Let the WordPress API do the heavy lifting for cleaning up entire post trails
            $purge = wp_delete_post($post->ID);
        }
    }
}

Estos son los dos enfoques básicos para programar eventos en WordPress.

Enfoque # 1: uso de WP-Cron

Ya que esta es la forma WP de hacer esto, primero veremos este enfoque. Tenga en cuenta que WP Cron no es verdadero cron, y a menudo se llama psuedo-cron. No es coherente si tiene poco tráfico en un sitio, ya que se basa en las solicitudes al servidor. Si no llega ninguna solicitud, entonces su evento programado se retrasa.

Programa tu evento

if(!wp_next_scheduled( 'foobar_truncate_posts_schedule')){
    wp_schedule_event(time(), 'daily', 'foobar_truncate_posts_schedule');
}

Enganche a la acción de tu calendario

add_action('foobar_truncate_posts_schedule', 'foobar_truncate_posts');

Si encuentra que a WP-Cron le falta la programación, la publicación de publicaciones programadas, etc., puede automatizarlo aún más con un cron de UNIX. Aquí hay un gran artículo para le muestra cómo hacer ping a wp-cron.php a intervalos especificados. Esto es lo que recomiendan para mantener wp-cron a tiempo usando un cron de UNIX.

wget http://www.server.com/wp-cron.php > /dev/null 2>&1

Enfoque # 2: uso de un cron de UNIX

Puede usar crons de UNIX verdaderos con la funcionalidad nativa admin-ajax.php.

Verifica cURL en tu servidor

Este enfoque utiliza cURL, que debe instalarse en su servidor. Si no, y estás usando Apache, sudo apt-get install php5-curl y luego sudo /etc/init.d/apache2 restart .

Crea un gancho AJAX

Asegúrese de configurarlo en nopriv ya que su servidor no se autentificará con WP.

add_action('wp_ajax_nopriv_truncate_posts', 'foobar_truncate_posts_cron');
function foobar_truncate_posts_cron(){

    # We use the user-agent as a shared key
    $shared_user_agent = 'FooBar TruncatePostsCron/1.0';

    # Block unwanted IP addresses
    $whitelisted_ips = array( //IPs allowed to run this operation
        '192.168.1.1',
        '127.0.0.1'
    );

    # Retrive Request Information
    $request_user_agent = $_SERVER['HTTP_USER_AGENT'];
    $request_ip = $_SERVER['REMOTE_ADDR'];


    # Authenticate
    if($request_user_agent === $shared_user_agent && in_array($request_ip, $whitelisted_ips))
        echo foobar_truncate_posts(); // Reusable function
    else
        echo 'Authentication failed for post trucation cron.';

    exit;
}

Agrega tu Crontab

Esta configuración se ejecutará una vez al día de forma consistente. -A establece el secreto del agente de usuario compartido -o especifica un archivo de salida, action=truncate_posts es relativo a su acción de enlace ajax. Verifique que /user/bin/curl es una ruta adecuada para ejecutar un comando cURL. Es posible que solo puedas usar curl en su lugar.

0 0 * * * /usr/bin/curl -A 'FooBar TruncatePostsCron/1.0' -o ~/truncate_posts.log http://yourdomain.com/wp-admin/admin-ajax.php?action=truncate_posts

Y, por último, siempre asegúrate de configurar register_globals=off en tu php.ini para evitar falsificaciones de cualquier tipo.

Y, finalmente ...

Estos son los dos enfoques principales de WordPress + cron (ya sea cierto o no). Hay muchas formas de despellejar a un gato con su caso de uso específico en foobar_truncate_posts() . Estoy seguro de que puedes modificarlo desde aquí. Espero que esto te ayude!

    
respondido por el Brian Fegter 28.08.2012 - 06:30
0

El método más sólido sería utilizar el propio WP-Cron. Pero si tiene un requisito muy ligero, puede dejarlo como tal y no se producirán problemas como las múltiples visitas que activan el wp-cron varias veces y la superposición de eventos.

Debe referirse a ¿Es seguro ejecutar wp-cron.php dos veces si la primera instancia toma demasiado tiempo?

Se indica claramente allí (en realidad, la respuesta que merece más votos) tiene la declaración en el tercer párrafo "porque wp-cron reprograma y anula los trabajos a medida que avanza. Justo antes de ejecutar un trabajo, lo anula. Esto evita el trabajo se ejecuta dos veces ", sí, hay temores de que puede haber una condición de carrera que podría ocurrir cuando un blog bogged podría patear el mismo evento dos veces.

Ahora el equipo de wordpress tiene una solución para el mismo, y es deshabilitar el cron en wp-config.php. Esto no desactiva el cron, pero en realidad desactiva la activación del cron cuando ocurre una visita. Después de esto, se puede configurar un cron web usando wget o curl, pero si no estamos seguros de que los servicios terminarán dentro de 30 segundos, que es el tiempo de espera predeterminado para un script php, entonces el cron debe configurarse en el propio servidor usando el php cli. Un documento más detallado sobre cómo hacer esto está disponible en enlace

    
respondido por el Jiju Thomas Mathew 17.10.2014 - 04:40

Lea otras preguntas en las etiquetas