WordPress

WP cron i aktualizacja meta postu

  • 19 października, 2018
  • 4 min read
WP cron i aktualizacja meta postu


Próbuję utworzyć zaplanowane zadanie cron, które działa co godzinę. To mój pierwszy raz, kiedy pracuję z wp-cron.

W funkcji cron chcę zaktualizować meta wartości postów, jeśli spełnione są pewne warunki.

Przetestowałem również kod funkcji cron poza cronem, aby zobaczyć/wydrukować wyniki. Wyniki wyglądały dobrze, ale po uruchomieniu cronjob żaden post nie zostanie zaktualizowany.

Używam WP Crontrol, aby zobaczyć wszystkie dostępne cronjobs.

Najpierw planuję wydarzenie (wydaje się, że to działa):

function prfx_hourly_status_update_cron_job() {
    if ( ! wp_next_scheduled( 'prfx_run_hourly_status_update_cron_job' ) ) {
        wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'prfx_run_hourly_status_update_cron_job' );
    }
}
add_action( 'wp', 'prfx_hourly_status_update_cron_job' );

Po utworzeniu tego zdarzenia spróbuję uruchomić tę funkcję.

Dostaję wszystkie posty, które mają pole meta, w którym wartość nie jest pusta.
To pole jest datą. (Ymd)
Dla każdego postu/produktu otrzymuję dwie wartości meta.
Ostateczny termin i wcześniejszy termin-wkrótce-data.
Porównuję dzisiejszą datę z tymi zapisanymi datami i chcę na tej podstawie zaktualizować inną wartość meta.

function prfx_run_hourly_status_update_cron_job( ) {

    // create meta query to get all posts which have a deadline date (field not empty)
    $args = array(
        'posts_per_page'   => -1,
        'meta_query' => array(
            array(
                'key' => '_prfx_custom_product_deadline',
                'value'   => '',
                'compare' => '!='
            ),
        ),
        'post_type' => 'product',
        'no_found_rows' => true, //speeds up a query significantly and can be set to 'true' if we don't use pagination
        'fields' => 'ids', //again, for performance
    );
    $posts_array = get_posts( $args );

    // start if we have posts
    if ($posts_array) {

        // get todays date in Y-m-d format
        $today = date('Y-m-d');

        //now check conditions and update the code
        foreach( $posts_array as $post_id ){

            $saved_deadline = get_post_meta( $post_id, '_prfx_custom_product_deadline', true ); // get deadline-date
            $soon_deadline = get_post_meta( $post_id, '_prfx_custom_product_deadline_soon', true );// get deadline-soon-date

            if ($today > $saved_deadline) { // if today is after deadline
                update_post_meta( $post_id, '_prfx_custom_product_status', 'deadline-met' );
            } elseif ($today < $saved_deadline && $today > $soon_deadline) { // if today is before deadline but after soon-deadline
                update_post_meta( $post_id, '_prfx_custom_product_status', 'deadline-soon' );
            }

        }
    }
}

Jak wspomniano powyżej, próbowałem uruchomić tę funkcję na sucho, zamiast update_post_meta właśnie wydrukowałem dane. To wydaje się działać. Używam również podobnej funkcji do echa niektórych ciągów znaków w interfejsie użytkownika, więc porównanie dat również działa.

Warto przeczytać!  php — Lokalizacja problemów z tłumaczeniem

Aktualizacja: Więc nie mogę tego zmusić do pracy z cronjobs. Właśnie przetestowałem następujący kod wewnątrz wtyczki, gdy aktywuję wtyczkę, kod działa. Zapytanie działa dobrze, wydrukowałem/sprawdziłem wyniki i działa jako prosty kod wtyczki.

Ale ten sam kod nie działa w cronjob. Kiedy patrzę na dane wyjściowe crona za pomocą Wp Crontrol, widzę godzinne zdarzenie „prfx_run_hourly_status_update_cron_job”, ale bez przypisanego działania. Jednak na przykład „woocommerce_geoip_updater” również nie ma wymienionej akcji.
Może ktoś ma pomysł dlaczego?

Oto przetestowany kod:

add_action('init','prfx_resave_posts');
function prfx_resave_posts(){

    $args = array(
        'posts_per_page'   => -1,
        'post_type'        => 'product',
        'meta_query' => array(
            array(
                'key' => '_prfx_custom_product_deadline_soon',
                'value'   => '',
                'compare' => '!='
            ),
        ),
        'no_found_rows' => true, //speeds up a query significantly and can be set to 'true' if we don't use pagination
        'fields' => 'ids', //again, for performance
    );
    $posts_array = get_posts( $args );

    if ($posts_array) { //output: Array ( [0] => 120399 [1] => 120431 [2] => 120469 [3] => 120401 [4] => 120433 )

        // get todays date in Y-m-d format
        $today = date('Y-m-d');

        foreach ($posts_array as $my_post) {

            #print_r($my_post);
            //output example: 120399

            $saved_soon_deadline = get_post_meta( $my_post, '_prfx_custom_product_deadline_soon', true );

            #print_r($saved_soon_deadline);
            //output: 2018-11-30

            if ($today > $saved_soon_deadline) {
                update_post_meta( $my_post, '_prfx_custom_product_status', 'my-new-val-here' );
            }

        }
    }

}


Źródło

Warto przeczytać!  rest api — Wordpress — Formularz kontaktowy 7 — Problem z pobraniem przesłanego pliku