web-dev-qa-db-fra.com

Supprimer les publications d'un type de publication automatiquement via Cron

comment puis-je utiliser Cron pour supprimer des publications d'un certain type de message une fois qu'elles ont atteint une certaine limite, comme par exemple conserver un maximum de 50 publications?

La raison en est que ces publications sont importées automatiquement périodiquement. Je souhaite donc éviter que la base de données ne devienne trop volumineuse, mis à part le fait que les anciennes publications ne seront plus nécessaires.

3
urok93

Bien que je ne comprenne pas la motivation pour tronquer les publications, je pense que cet exercice est précieux pour vous permettre de comprendre comment utiliser cron + WordPress.

Créer une fonction pour tronquer les posts

Ceci peut être utilisé pour les deux méthodes ci-dessous WP-cron ou 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);
        }
    }
}

Voici les deux approches de base pour la planification d'événements dans WordPress.

Approche n ° 1: Utiliser WP-Cron

Comme il s’agit de la manière dont WP _, nous allons d'abord examiner cette approche. Veuillez noter que WP Cron n'est pas un vrai cron et s'appelle souvent psuedo-cron. Ce n'est pas cohérent si le trafic sur un site est faible, car il est basé sur des requêtes adressées au serveur. Si aucune demande n'arrive, votre événement planifié a lieu tardivement.

Planifiez votre événement

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

Accrochez-vous à votre agenda

add_action('foobar_truncate_posts_schedule', 'foobar_truncate_posts');

Si vous constatez que votre calendrier, la publication de messages programmés, etc. Voici un excellent article pour vous montrer comment exécuter une commande ping sur wp-cron.php à des intervalles spécifiés. Voici ce qu'ils recommandent de garder à temps wp-cron en utilisant un cron UNIX.

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

Approche n ° 2: Utiliser un cron UNIX

Vous pouvez utiliser de véritables crones UNIX avec la fonctionnalité native admin-ajax.php.

Vérifiez cURL sur votre serveur

Cette approche utilise cURL qui devrait être installé sur votre serveur. Si ce n'est pas le cas et que vous utilisez Apache, Sudo apt-get install php5-curl puis Sudo /etc/init.d/Apache2 restart.

Créer un hook AJAX

Assurez-vous de le définir sur nopriv car votre serveur ne s'authentifiera pas avec 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;
}

Ajoutez votre Crontab

Cette configuration sera exécutée une fois par jour de manière cohérente. -A définit le secret de l'agent d'utilisateur partagé -o spécifie un fichier de sortie, action=truncate_posts est relatif à votre action de raccordement ajax. Verify /user/bin/curl est un chemin approprié pour exécuter une commande cURL. Vous pourriez peut-être simplement utiliser curl à la place.

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

Et enfin, assurez-vous de toujours définir register_globals=off dans votre fichier php.ini afin d'éviter toute usurpation d'identité.

Et enfin...

Ce sont les deux approches principales de WordPress + cron (que ce soit vrai ou non). Il existe de nombreuses façons de personnaliser un chat avec votre cas d'utilisation spécifique dans foobar_truncate_posts(). Je suis sûr que vous pouvez le modifier d'ici. J'espère que cela vous aide!

13
Brian Fegter

La méthode la plus solide serait d’utiliser WP-Cron lui-même. Mais si vous avez un besoin très léger, vous pouvez le laisser tel quel. Aucun problème tel que visites multiples ne déclenchera plusieurs fois le wp-cron et les événements ne se chevaucheront jamais.

Devrait se référer à Est-il prudent de lancer wp-cron.php deux fois si la première instance prend trop de temps?

Il est clairement indiqué ici (en fait, la réponse qui mérite plus de votes) figure dans le troisième paragraphe "parce que wp-cron reprogramme et annule les travaux au fur et à mesure de son exécution. Juste avant d'exécuter un travail, il est également programmé. Cela empêche le travail de courir deux fois ", oui, il y a des craintes qu'il puisse y avoir une situation de concurrence critique dans laquelle un blog encombré de lourds bourrages papier pourrait donner le même événement deux fois.

Maintenant, l'équipe wordpress a une solution pour le même problème, à savoir désactiver le cron dans le fichier wp-config.php. Cela ne désactive pas cron, mais désactive le déclenchement de cron lorsqu'une visite a lieu. Après cela, un cron web peut être configuré en utilisant wget ou curl, mais si nous ne sommes pas certains que les services se termineront dans les 30 secondes, délai par défaut pour un script php, le cron devrait être configuré sur le serveur lui-même, à l'aide de le php cli. Un document plus détaillé sur la procédure à suivre est disponible à l’adresse https://rtcamp.com/tutorials/wordpress/wp-cron-crontab/

0
Jiju Thomas Mathew