web-dev-qa-db-fra.com

title_save_pre après publication

J'essaie de créer le titre d'une publication personnalisée à l'aide des valeurs contenues dans les champs de publication personnalisés. Le problème est que l'utilisation de title_save_pre ne s'exécute que lorsque je met à jour le message, pas lorsque je le crée.

Lorsque je crée le message, je reçois le titre: (pas de titre) Si je modifie et enregistre, je reçois le bon titre.

J'ai besoin d'obtenir le bon titre en backend.

Ceci est mon code:

function update_phone_title($title) {

global $post;

$type = get_post_type($post->ID);

if ( 'phone' == $type) {
    $title = get_post_meta($post->ID, 'manufacturer', TRUE);
    $title .= ' '.get_post_meta($post->ID, 'model', TRUE);
    $title .= ' '.get_post_meta($post->ID, 'memory', TRUE);
} 

return $title;
}
add_filter ('title_save_pre', 'update_phone_title');

FIXED using wp_insert_post_data. Je l'ai fait avec ce code:

function filter_handler( $data , $postarr )
{
  global $post;
  $id = $post->ID;

  if('phone' == $data['post_type'] && isset($data['post_type']))
    if($id) {
        $title = $_POST['fields']['field_4fd2897fc0bfe']. ' ' . $_POST['fields']['field_4fd2897fc2328'] . ' ' .$_POST['fields']['field_4fd2897fc273a'];
        $data['post_title'] = $title;
    }
  return $data;
}

add_filter( 'wp_insert_post_data' , 'filter_handler' , '99', 2 );
3
Bdesign

Le filtre title_save_pre s'exécute avant que la publication ne soit écrite dans la base de données, et également avant qu'une méta de la publication ne soit enregistrée dans la base de données. Donc, get_post_meta sera à ce stade vide pour la première exécution et renverra toujours les "anciennes" données.

Pour corriger cela, vous devez vous connecter à save_post et mettre à jour la publication à partir de là. save_post est exécuté une fois que le message a été enregistré dans la base de données et que les "champs personnalisés" intégrés ont été enregistrés.

Pour ce faire, vous pouvez utiliser wp_update_post . Cependant, vous devrez faire attention:

Lorsqu'il est exécuté par une action liée à save_post (une métabox personnalisée, par exemple), wp_update_post () a le potentiel de créer une boucle infinie. Cela se produit parce que (1) wp_update_post () entraîne le déclenchement de save_post et que (2) save_post est appelé deux fois lorsque les révisions sont activées (tout d'abord lors de la création de la révision, puis lors de la mise à jour de la publication d'origine, ce qui entraîne la création de révisions sans fin).

Si vous devez mettre à jour une publication à partir du code appelé par save_post, assurez-vous que post_type n'est pas défini sur 'revision' et que l'objet $ post doit effectivement être mis à jour.

Une solution consiste à supprimer le rappel save_post du point d'ancrage à l'intérieur du rappel, comme démontré here .

3
Stephen Harris