Запустите задание cron (или аналогичное) в фоновом режиме WP после публикации обновления/создания
Я хотел бы запустить фильтр для содержимого публикации после того, как оно было создано или обновлено.
Я бы хотел, чтобы это произошло после того, как пользователь отправил сообщение, так как это может быть немного длительный процесс (поиск/замена для поиска терминов глоссария и замены их ссылками).
Какой наиболее эффективный и надежный способ добиться этого?
Заранее благодарю,
3 answers
Хорошо, вот код, который я только что придумал. Совершенно непроверенный, просто написал его прямо с cuff...so не ожидайте, что он будет работать на 100%, когда вы его бросите, но основная концепция есть, как и приличный объем работы
add_action( 'my_filter_posts_content', 'my_filter_content' );
add_action( 'save_post', 'my_set_content_filter' );
if( !wp_next_scheduled( 'my_filter_posts_content' ) ) {
wp_schedule_event( time(), 'hourly', 'my_filter_posts_content' );
}
function my_filter_content() {
//check to see if posts need to be parsed
if( get_option( 'my_updated_posts' ) == false )
return false;
//parse posts
$ids = unserialize( get_option( 'my_updated_posts' ) );
foreach( $ids as $v ) {
YOUR_FUNCTION_HERE( $v );
}
//make sure no values have been added while loop was running
$id_recheck = unserialize( get_option( 'my_updated_posts' ) );
my_close_out_filter( $ids, $id_recheck );
/*
once all options, including any added during the running of what
could be a long cronjob are done, remove the value and close out
*/
delete_option( 'my_updated_posts' );
return true;
}
function my_set_content_filter( $post_id ) {
//get the previous value
$ids = unserialize( get_option( 'my_updated_posts' ) );
//add new value if necessary
if( !in_array( $post_id, $ids ) ) {
$ids[] = $post_id;
update_option( 'my_updated_posts', serialize( $ids ) );
}
}
function my_close_out_filter( $beginning_array, $end_array ) {
$diff = array_diff( $beginning_array, $end_array );
if( !empty ( $diff ) ) {
foreach( $diff as $v ) {
YOUR_FUNCTION_HERE( $v );
}
}
my_close_out_filter( $end_array, unserialize( get_option( 'my_updated_posts' ) ) );
}
Пожалуйста, смотрите мой ответ здесь . Это доказательство концепции запуска собственного crontab в Linux с вашей установкой WP.
Что касается функциональности WP-Cron, остерегайтесь следующих предостережений:
- WP-Cron - это псевдо-cron, который запускается при загрузке WP. WP проверяет, запланирован ли запуск WP-Cron или отстает от графика, а затем выполняет сценарий cron.
- При недостаточном трафике ваш cron может работать очень поздно.
- Планирование WP-Cron для запуска во время часы пик могут вызвать некоторые проблемы с производительностью, если это большой, интенсивный сценарий.
Если вы решите пойти по маршруту WP-Cron, вот отличная статья, в которой показано, как его использовать. Вы также можете ознакомиться с функциями WP в Кодексе здесь.
Я предпочитаю надежность кронтаба Linux, особенно для встроенных, тяжелых cron-скриптов. Для чрезвычайно легких сценариев я иногда использую WP-Cron.
Надеюсь, это поможет!