web-dev-qa-db-fra.com

Mettre à jour le menu lors de l'enregistrement des paramètres

J'ai une page de paramètres pour mon plug-in dans laquelle l'utilisateur peut activer ou désactiver un type de publication personnalisé. Lorsque le plugin est initialisé, je vérifie ensuite ce paramètre pour voir si le type de contenu personnalisé doit être enregistré ou non. La méthode registerPostType() est appelée sur l'action init:

class CPT {
  private $enabled = false;

  public function __construct()
  {
    // Handle form submission.
    add_action('init', array($this, 'checkFormSubmission'), 8);

    // Load settings.
    $settings = get_option('cpt_settings');
    $this->enabled = $settings['enabled'];

    // Add menu.
    add_action('admin_menu', array($this, 'registerMenu'));

    // Register custom post type if enabled.
    if ($this->enabled) {
        add_action('init', array($this, 'registerPostType'));
    }
  }

  public function registerMenu()
  {
    add_submenu_page(
        'options-general.php',
        __('CPT Settings', 'cpt'),
        __('CPT Settings', 'cpt'),
        'manage_options',
        'cpt',
        array($this, 'renderSettingsPage')
    );
  }

  public function registerPostType()
  {
    $args = array(
        'labels' => array(
          'name' => 'CPT',
        ),
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'query_var' => true,
        'capability_type' => 'post',
        'has_archive' => true,
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt')
    );
    register_post_type('sample-cpt',  $args);
  }

  public function checkFormSubmission()
  {
    // Validate so user has correct privileges.
    if (!current_user_can('manage_options')) {
      die(__('You are not allowed to perform this action.', 'cpt'));
    }

    // Check if settings form is submitted.
    if (filter_input(INPUT_POST, 'cpt-settings', FILTER_SANITIZE_STRING)) {
      // Verify nonce and referer.
      check_admin_referer('cpt-settings-action', 'cpt-settings-nonce');
      $this->enabled = filter_input(
          INPUT_POST,
          'cpt-enable',
          FILTER_VALIDATE_BOOLEAN
      );
      update_option('cpt_settings', array('enabled' => $this->enabled));
    }
  }

  public function renderSettingsPage()
  {
    require_once plugin_dir_path(__FILE__ ) . '/admin/templates/settings-page.php';
  }
}

new CPT();

Cela fonctionne comme prévu, mais le problème est que, lorsque j'enregistre le formulaire, l'élément de menu pour le type de publication personnalisé n'est pas mis à jour jusqu'à ce que je recharge la page. Évidemment, c'est parce que le menu est déjà créé.

Ma première pensée est que je n'utilise pas les crochets corrects pour prendre en charge la soumission du formulaire et enregistrer mon message personnalisé. Peut-être que les crochets devraient être ajoutés avec une priorité plus élevée?

J'ai essayé d'utiliser wp_redirect() après l'enregistrement du paramètre, mais je ne peux pas définir d'en-tête, car la sortie a déjà commencé.

Quelqu'un peut-il expliquer s'il vous plaît comment je peux créer l'élément de menu pour ma mise à jour de type d'article personnalisée lors de l'enregistrement du paramètre de mon plugin?

1
Cyclonecode

Au début, j’ai complètement mal compris votre question (trop de thé, trop centré sur mon idée initiale de votre problème au lieu d’une lecture attentive;).

Je crois que le problème n'est pas que le menu est déjà créé (admin_menu est exécuté après init), mais plutôt que registerPostType ne sera exécuté dans init que s'il est activé (et non s'il est activé).

Déplacement de if ($this->enabled) { dans registerPostType et exécution inconditionnelle sur init, par ex. il suffit de mettre

if (!$this->enabled) return;

au sommet de registerPostType et en changeant

// Register custom post type if enabled.
if ($this->enabled) {
    add_action('init', array($this, 'registerPostType'));
}

à

// Register custom post type if enabled.
add_action('init', array($this, 'registerPostType'));

me semble le plus logique.

1
janh