L’action save_post n’est pas déclenchée dans wordpress

Publié par Jean-Michel le

Je développe un thème qui inclut une logique pour ajouter des champs personnalisés dans le panneau d’administration à toutes les pages sauf celles que j’ai incluses dans un tableau d’exclusion. Ceci est montré par une fonction showSection(). Cela fonctionne bien mais semble que l’action save_post_page n’est pas déclenchée donc les données ne sont pas mises à jour :

function __construct() {

  if ($this->showSection()) {

    $this->title = get_post_meta(get_the_ID(), 'lorraine_landing_title', true);
    $this->subtitle = get_post_meta(get_the_ID(), 'lorraine_landing_subtitle', true);

    $this->addAction('add_meta_boxes_page', array($this, 'addMetaBox') );
    $this->addAction('save_post_page', array($this, 'saveMetaBox') );

  }

}

public function showSection() {
  if (isset($_GET['post'])) {
    $slug = get_post_field('post_name', $_GET['post']);
    return !in_array($slug, $this->pageWithoutSections);
  }
}

function saveMetaBox($postId) {

  if (isset($_POST['lorraine_landing_title'])) {

    check_admin_referer('lorraine_admin_landing_save', 'lorraine_admin_landing_nonce_field');

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
      return;
    }

    //Save data
    update_post_meta($postId, 'lorraine_landing_title', sanitize_text_field( $_POST['lorraine_landing_title']));
    update_post_meta($postId, 'lorraine_landing_subtitle', sanitize_text_field( $_POST['lorraine_landing_subtitle']));

  }

}

Si je n’appelle pas showSection(), l’action save_post_page est déclenchée. Il semble que $_GET[‘post’] soit à l’origine du conflit, mais j’ai besoin d’un identifiant de page pour afficher ou masquer des sections et je n’ai pas accès à la fonction get_the_ID().

Mise à jour

get_post_meta fonctionne parce que j’ai une autre fonction printTemplate qui nécessite un fichier html metabox et à l’intérieur j’instancie la classe :

function addMetaBox() {
  add_meta_box('lorraine-admin-landing', __('Landing'), array($this, 'printTemplate'), 'page', 'normal', 'default');
}

function printTemplate($post, $box) {
  require_once( get_stylesheet_directory() . '/components/admin/landing/landing-html.php');
}

fichier landing-html.php

<?php $adminLanding = new AdminLanding(); ?>

<?php wp_nonce_field('lorraine_admin_landing_save', 'lorraine_admin_landing_nonce_field'); ?>

<div class="form__item">
  <label for="name"><?php _e('Título', 'lorraine'); ?></label>
  <input name="lorraine_landing_title" type="text" class="form__input" value="<?php echo $adminLanding->getTitle(); ?>" maxlength="60" placeholder="<?php _e('Introduce el título de la landing', 'lorraine'); ?>">
</div>

<div class="form__item">
  <label for="name"><?php _e('Subtítulo', 'lorraine'); ?></label>
  <input name="lorraine_landing_subtitle" type="text" class="form__input" value="<?php echo $adminLanding->getSubtitle(); ?>" maxlength="60" placeholder="<?php _e('Introduce el subtítulo de la landing', 'lorraine'?>">
</div>

Mise à jour 2

Donc… en action hook « add_meta_boxes_page » get_the_ID() est disponible et dans le codex est écrit ceci :

add_meta_boxes
Runs when "edit post" page loads.

Quel crochet la page « modifier le message » charge-t-elle ?

https://codex.wordpress.org/Plugin_API/Action_Reference#Administrative_Actions

Solution n°1 trouvée

La solution:

Supprimez la méthode showSection du constructeur et ajoutez-la dans addMetabox :

function __construct() {

  $this->title = get_post_meta(get_the_ID(), 'lorraine_landing_title', true);
  $this->subtitle = get_post_meta(get_the_ID(), 'lorraine_landing_subtitle', true);

  $this->addAction('add_meta_boxes_page', array($this, 'addMetaBox') );
  $this->addAction('save_post_page', array($this, 'saveMetaBox') );

}

function addMetaBox() {
  if ($this->showSection()) {
    add_meta_box('lorraine-admin-landing', __('Landing'), array($this, 'printTemplate'), 'page', 'normal', 'default');
  }
}

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *