Execută acțiunea după ce articolul este salvat cu toate înregistrările post_meta asociate (date)
Trebuie să execut cod PHP personalizat după ce un articol nou este salvat cu toate meta datele sale.
Întrebarea mea este cum pot realiza acest lucru? Am încercat cu acțiunea save_post, dar aceasta se execută înainte ca înregistrările meta să fie salvate, așa că nu o pot folosi în acest caz.
Deci, cum pot rula funcția mea personalizată după ce articolul cu toate datele asociate este salvat în baza de date?
ACTUALIZARE: Am încercat să realizez acest lucru cu următorul cod în fișierul functions.php:
add_action( 'save_post', 'wpse41912_save_post' );
function wpse41912_save_post() {
// obține informații despre ultimul articol adăugat
$args = array( 'numberposts' => '1', 'post_type' => 'post' );
$recent_posts = wp_get_recent_posts( $args );
$myFunc_latest_id = $recent_posts[0]['ID']; // id-ul ultimului articol
$myFunc_post_details = get_post($myFunc_latest_id);
print_r($myFunc_post_details);
// cum să executăm cod php când toate meta datele articolului sunt adăugate?
}
Mulțumesc anticipat!

Pentru un articol NOU de tipul 'post' folosește acțiunea draft_to_publish
:
function fpw_post_info( $post ) {
if ( 'post' == $post->post_type ) {
// echo '<pre>'; print_r( $post ); echo '<br />';
// $meta = get_post_meta( $post->ID ); print_r( $meta ); echo '</pre>'; die();
// codul tău personalizat aici...
}
}
add_action( 'draft_to_publish', 'fpw_post_info', 10, 1 );
În funcția callback $post
este obiectul articolului de tip WP_post
. Poți obține metadatele articolului apelând funcția get_post_meta
.
Pentru un articol NOU sau ACTUALIZAT de tipul 'post' folosește acțiunea publish_post
:
function fpw_post_info( $id, $post ) {
// echo '<pre>'; print_r( $post ); echo '<br />';
// $meta = get_post_meta( $post->ID ); print_r( $meta ); echo '</pre>'; die();
// codul tău personalizat aici...
}
add_action( 'publish_post', 'fpw_post_info', 10, 2 );
În acest caz, funcția callback primește doi parametri!

Mulțumesc, dar nu se întâmplă nimic folosind acțiunea publish_post... Am încercat să folosesc și hook-ul added_post_meta, dar acesta se execută după fiecare meta adăugată - am nevoie de cel care se execută după ultima meta adăugată

Ce înseamnă că nu se întâmplă nimic? Ai folosit codul de mai sus fără a elimina comentariile din primele două linii? Arată-mi codul tău? Îl folosești pentru un tip personalizat de postare sau doar pentru 'post'?

Citește răspunsul actualizat pentru utilizarea corectă a hook-ului de acțiune publish_post
.

Soluție destul de stupidă, dar funcționează:
function afterPostUpdated($meta_id, $post_id, $meta_key='', $meta_value=''){
if($meta_key=='_edit_lock') {
if($_GET['message']==1) {
//
Codul tău aici
//
}
}
}
add_action('updated_post_meta', 'afterPostUpdated', 10, 4);

Ai putea folosi asta:
function myFunction($post_id, $post, $update ) {
// codul tău aici
}
add_action('save_post', 'myFunction');
$update
este un boolean și returnează false dacă acesta este un post nou. Dacă este o actualizare, returnează true.
Iată documentația: https://developer.wordpress.org/reference/hooks/save_post/

Răspunsul corect și mai simplu este să folosești acțiunea wp_insert_post
.
https://developer.wordpress.org/reference/hooks/wp_insert_post/
O distincție importantă a acțiunii wp_insert_post este că aceasta este declanșată după ce update_post_meta a fost apelat.
Sunt disponibili 3 parametri - flagul $update îți spune dacă acesta este un post nou sau actualizat.
add_action('wp_insert_post', 'run_after_post_updated', 10, 3);
function run_after_post_updated($post_ID, $post = null, $update = true) {
//chiar dacă documentația spune că sunt 3 parametri, se pare că uneori este transmis doar postid-ul - deci ai nevoie de valori implicite pentru ceilalți 2 parametri
$meta = get_post_meta( $post_ID );
// ...
}
