добавить действие в wp cron?
Я хотел бы выполнять некоторый код каждый раз, когда запускается мой cron wordpress, независимо от временных рамок. Можно ли для этого создать add_action? Я заглянул в список фильтров, но не смог найти ничего подходящего.
Спасибо!
5 answers
В основном каждая загрузка страницы проверяет, есть ли что-то запланированное для запуска, поэтому по этой логике cron проверяется и, возможно, может запускаться при каждой загрузке страницы.
Я могу только предположить, что вы хотите запланировать что-то для запуска так часто. Если это так, вам нужно посмотреть на wp_schedule_event()
Ниже приведен код, чтобы заставить некоторый код работать каждый час:
add_action('my_hourly_event', 'do_this_hourly');
// The action will trigger when someone visits your WordPress site
function my_activation() {
if ( !wp_next_scheduled( 'my_hourly_event' ) ) {
wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'my_hourly_event');
}
}
add_action('wp', 'my_activation');
function do_this_hourly() {
// do something every hour
}
Если вы хотите запустить свой собственный код, когда запущен чужой cron, вам нужно подключиться к их действие, которое уволено. Итак, давайте предположим, что приведенный выше код является чужим плагином, и вы хотите запускать свой код каждый раз при запуске их.
Ну, они создали действие, подобное этому:
add_action('my_hourly_event', 'do_this_hourly');
Итак, все, что вам нужно сделать, это перенести свою функцию на это:
add_action('my_hourly_event', 'my_flush_function');
function my_flush_function() {
// Do your code here
}
После этого замечания из ОП:
Чтобы было понятнее, у меня есть запланированные публикации в будущем, и я хочу, чтобы кэш очищался при публикации с помощью триггера wp-cron. Может быть, есть лучший способ?
Я не знаю, если плагин W3 Total Cache не очищает кэш автоматически при публикации сообщений. Я верил, что это так. Если это не так - тогда в этом случае я бы зацепился за крючок после перехода ( см. Связанный вопрос) и сбросил тогда в тайнике. Таким образом, всякий раз, когда сообщение меняет статус (через wp-cron или иным образом), кэш обновляется, чтобы отразить это.
//Runs whenever a post changes status
add_action('transition_post_status','wpse49927_transition_post_status',10,3);
function wpse49927_transition_post_status($new_status,$old_status,$post){
//Flush cache
flush_pgcache();
}
Исходная проблема
В ответ на первоначальный вопрос: запуск функции всякий раз, когда запускается wp-cron - я не думаю, что это возможно программно - и решение, данное @Brady, вероятно, ближе всего к этому вы подойдете.
Недавно мне пришлось сделать то же самое с общим кэшем w3, вот как я это реализовал (упрощено для ответа на вопрос OP)
<?php
/**
* fac_all_crons allows you to attach a function to all wp-cron's registered in a WordPress site
* @author Russell Fair
* @uses wp_get_schedules to get a list of registered crons
*/
function fac_all_crons(){
$schedules = wp_get_schedules();
if ( !$schedules )
return;
foreach ( $schedules as $key ){
if ( ! wp_next_scheduled( 'fac_cache_clear' ) ) {
wp_schedule_event( time(), $key, 'fac_cache_clear' );
}
}
}
add_filter('init', 'fac_all_crons');
/**
* fac_cache_clear does the actual cache clearing
* @author Russell Fair
*/
function fac_cache_clear(){
//do your cache clearing here
}
Чтобы очистить кэш страницы только тогда, когда будущая запланированная публикация действительно изменит свой статус на публикацию, рекомендуется использовать хук "publish_future_post". Добавьте фрагмент кода в свой functions.php .
Не используйте хук "transition_post_status", который тоже выполняется. Моя отладка показала, что иногда необходимый класс "W3_PGCACHEFLUSH" из плагина W3TC не может быть создан с помощью этого крючка.
/**
* This function clears the complete W3TC cache when a future post is published.
* jot 11.09.12
*/
add_action('publish_future_post', 'wpse_49927_clear_w3tc_cache_on_future_to_publish');
function wpse_49927_clear_w3tc_cache_on_future_to_publish( $post_id) {
if (function_exists('w3_instance') && class_exists('W3_PgCacheFlush')) {
$w3_pgcache = & w3_instance('W3_PgCacheFlush');
if (is_object($w3_pgcache) && method_exists($w3_pgcache, 'flush')) {
$w3_pgcache->flush();
}
}
}
Для тех, кто прибывает сюда, есть способ выполнять некоторый код при каждом вызове URL-адреса cron, и это можно просто сделать с помощью следующего кода:
add_action( 'init', 'my_function_on_each_cron_call' );
function my_function_on_each_cron_call() {
if ( isset( $_GET[ 'doing_wp_cron' ] ) && $_SERVER['REQUEST_URI'] == '/wp-cron.php?doing_wp_cron' ) {
// YOUR CODE GOES HERE
}
}
Где $_SERVER['REQUEST_URI'], вероятно, можно опустить, но это не опасно.