Execută acțiunea după ce articolul este salvat cu toate înregistrările post_meta asociate (date)

22 iun. 2015, 15:26:15
Vizualizări: 29K
Voturi: 6

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!

2
Comentarii

Este metadatele postării salvate în aceeași funcție?

Manny Fleurmond Manny Fleurmond
22 iun. 2015 15:54:38

Hm, nu sunt sigur despre întrebarea ta... Te rog verifică partea actualizată a întrebării mele, parte din fișierul function.php

user198003 user198003
22 iun. 2015 16:11:43
Toate răspunsurile la întrebare 4
5

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!

23 iun. 2015 01:12:22
Comentarii

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ă

user198003 user198003
23 iun. 2015 10:39:51

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'?

Frank P. Walentynowicz Frank P. Walentynowicz
23 iun. 2015 16:37:38

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

Frank P. Walentynowicz Frank P. Walentynowicz
23 iun. 2015 17:37:25

Funcționează și pentru produsele WooCommerce?

Amjad Amjad
19 mar. 2019 03:07:29

Un produs WooCommerce este un tip de postare personalizat. Soluția de mai sus funcționează cu orice tip de postare.

Frank P. Walentynowicz Frank P. Walentynowicz
19 mar. 2019 05:09:10
0

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);
21 ian. 2016 20:56:27
0

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/

28 mai 2020 12:59:50
0

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 ); 
   //  ...
}
9 feb. 2022 17:39:42