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.
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.
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.
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.
if(!wp_next_scheduled( 'foobar_truncate_posts_schedule')){
wp_schedule_event(time(), 'daily', 'foobar_truncate_posts_schedule');
}
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
Vous pouvez utiliser de véritables crones UNIX avec la fonctionnalité native admin-ajax.php.
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
.
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;
}
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é.
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!
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/