J'essaie de renvoyer un champ personnalisé dès qu'une publication est publiée. J'utilise l'action publish_post
(ou {status}_{post_type}
), mais il semble que les champs personnalisés aient été créés après le raccordement.
Mon code dans functions.php
:
function create_recurring_posts( $ID, $post ) {
logMe(print_r(get_post_custom($ID), true));
}
add_action( 'publish_profile', 'create_recurring_posts', 10, 2 );
La fonction logMe()
enregistre simplement la sortie dans un fichier à des fins de test. Mon problème est que, lorsque je crée la publication de profil, les seuls champs personnalisés renvoyés sont _edit_last
et _edit_lock
. Mais lorsque je visualise la page par la suite, lorsque la même fonction get_post_custom()
est exécutée, je vois l'autre champ personnalisé dont j'ai besoin.
J'utilise Advanced Custom Fields pour la création de champs. Toute aide est appréciée.
Votre action est déclenchée dans wp_transition_post_status()
qui est appelée par wp_insert_post()
avant que l’action save_post
soit déclenchée. save_post
est l'action typique pour gérer les champs personnalisés. ACF travaille également sur ce sujet.
Fondamentalement, vous devez attendre qu'ACF ait terminé son travail, ce qui signifie que vous devez vous connecter à save_post
avec une priorité supérieure à 10 ou supérieure, utilisez wp_insert_post
qui se trouve juste après le save_post
.
Pour suivre la transition de statut de publication, vous pouvez utiliser un simple "journal" comme ceci:
<?php
namespace WPSE199070;
class PublishedTransitionLog {
/**
* @type array
*/
private $status_log = [];
/**
* logs a published post id
*
* @wp-hook publish_profile
*
* @param int $post_id
*/
public function published_post( $post_id ) {
$blog_id = get_current_blog_id();
if ( ! isset( $this->status_log[ $blog_id ] ) )
$this->status_log[ $blog_id ] = [];
if ( in_array( $post_id, $this->status_log[ $blog_id ] ) )
return;
$this->status_log[ $blog_id ][] = $post_id;
}
/**
* @param int $post_id
* @return bool
*/
public function post_published( $post_id ) {
$blog_id = get_current_blog_id();
if ( ! isset( $this->status_log[ $blog_id ] ) )
return FALSE;
return in_array( $post_id, $this->status_log[ $blog_id ] );
}
}
class PublishPostHandler {
/**
* @type PublishedTransitionLog
*/
private $log;
public function __construct( PublishedTransitionLog $log ) {
$this->log = $log;
}
/**
* @param int $post_id
* @param \WP_Post $post
* @param bool $updated
*/
public function update( $post_id, \WP_Post $post, $updated ) {
if ( ! $this->log->post_published( $post_id ) )
return;
// do your stuff here
}
}
$transition_log = new PublishedTransitionLog;
$handler = new PublisPostHandler( $transition_log );
add_action( 'publish_profile', array( $transition_log, 'published_post' ) );
add_action( 'wp_insert_post', array( $handler, 'update', 10, 3 ) );
Laissez-moi expliquer ceci. La première classe, PublishedTransitionLog
, écoute l'action publish_profile
et stocke chaque publication publiée pour chaque blog en interne. Il fournit également une méthode pour vérifier si un article a déjà été publié.
La deuxième classe devrait fournir votre logique et dépend de la première classe. Si le message n'a pas été publié, il ne fait rien.
De cette façon, vous pouvez écouter indépendamment pour tracter différents crochets.
@ David a expliqué pourquoi votre code ne fonctionne pas et a esquissé une solution (utilisez plutôt save_post
). Cependant, vous pouvez "chaîner" les crochets pour que vous puissiez toujours utiliser les filtres de transition pour contrôler l'exécution:
function create_recurring_posts( $ID, $post ) {
add_action(
'save_post',
function() {
// debug, since I don't have a `logMe()` function :)
var_dump(print_r(get_post_custom($ID), true));
die;
},
PHP_INT_MAX,
1
);
}
add_action( 'publish_profile', 'create_recurring_posts', 10, 2 );