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.
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' );
}
}
}
}