Запустите задание cron (или аналогичное) в фоновом режиме WP после публикации обновления/создания


Я хотел бы запустить фильтр для содержимого публикации после того, как оно было создано или обновлено.

Я бы хотел, чтобы это произошло после того, как пользователь отправил сообщение, так как это может быть немного длительный процесс (поиск/замена для поиска терминов глоссария и замены их ссылками).

Какой наиболее эффективный и надежный способ добиться этого?

Заранее благодарю,

 1
Author: turbonerd, 2012-02-17

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' ) ) );
}
 1
Author: mor7ifer, 2012-02-19 13:04:58

Пожалуйста, смотрите мой ответ здесь . Это доказательство концепции запуска собственного crontab в Linux с вашей установкой WP.

Что касается функциональности WP-Cron, остерегайтесь следующих предостережений:

  • WP-Cron - это псевдо-cron, который запускается при загрузке WP. WP проверяет, запланирован ли запуск WP-Cron или отстает от графика, а затем выполняет сценарий cron.
  • При недостаточном трафике ваш cron может работать очень поздно.
  • Планирование WP-Cron для запуска во время часы пик могут вызвать некоторые проблемы с производительностью, если это большой, интенсивный сценарий.

Если вы решите пойти по маршруту WP-Cron, вот отличная статья, в которой показано, как его использовать. Вы также можете ознакомиться с функциями WP в Кодексе здесь.

Я предпочитаю надежность кронтаба Linux, особенно для встроенных, тяжелых cron-скриптов. Для чрезвычайно легких сценариев я иногда использую WP-Cron.

Надеюсь, это поможет!

 1
Author: Brian Fegter, 2017-04-13 12:37:50

Будет ли действие save_post работать для вас?

<?php
add_action( 'save_post', 'wp_save_post' );
function wp_save_post()
{
    // do stuff
}

Вы также можете рассмотреть вариант edit_post или publish_post

Вы можете просмотреть другие действия в Кодексе

 0
Author: Kyle, 2012-02-17 16:07:11