web-dev-qa-db-fra.com

Admin: global $ post empty

J'ai essayé d'obtenir $ post var en dehors de la fonction php dans le panneau d'administration wordpress. La seule façon pour moi d'accéder à $ post est d'add_action.

Cependant, je souhaite obtenir cette variable en dehors de add_action et la variable globale ne semble pas fonctionner dans add_action.

Comment puis-je obtenir $ post dans le panneau d'administration en dehors de function.php.

Je cherche pendant des heures et je ne trouve pas de solution ...

EDIT: Exemple

require_once(TP_PLUGIN_PATH . 'includes/my-file-framework.php' ); // it'a a metabox framework
require_once(TP_PLUGIN_PATH . 'includes/my-file-config.php' ); // I load the     file that include metabox array to build metabox

class The_plugin_Admin {

    public function __construct() {
       add_action( 'pre_get_posts', array($this, 'the_metabox' ));
    }

    public function the_metabox() {
        apply_filters( 'the_metabox_setup','');
    }

}

new The_plugin_Admin;

Et mon fichier-config.php où je veux récupérer Wordpress global:

 add_filter( 'the_metabox_setup', 'the_metabox_setup_callback' );
 function the_metabox_setup_callback() {
      global $post;
      print_r($post); //empty
      $post_ID = isset($_GET['post']) ? $_GET['post'] : 0;
      echo $post_ID; // empty on new post because not already set

      $post_types = get_post_types(array('public' => true), 'names', 'and'); // no get all post type on the first time, need to loop again to get all

      $an_array[] = array(......);
      $an_array[] = array(......);
      $an_array[] = array(......);
      $an_array[] = array(......);

      foreach ($an_array as $array) {
           new The_Metabox($array); // contruct my metabox, the class was declared previous in my-file-framework.php
      }

 }
1
freaky

L'erreur fondamentale est que toutes les données sont disponibles au moment où vous écrivez votre code. Ce n’est pas le cas et des points d’accès permettent d’accéder au code principal pendant différents états de la procédure de chargement core. graphique  .

En bref et very les choses simplifiées fonctionnent like ceci:

# core loads
// ...more stuff...
# point at where all must-use-plugins are loaded - first entry point
do_action( 'muplugins_loaded' );
// ...more stuff...
# point at where all plugins are loaded - second entry point
do_action( 'plugins_loaded' );
// ...more stuff...
# main core stuff available - use this hook instead of `init` for multisite plugins
do_action( 'wp_loaded' );
// ...more stuff...
# themes functions.php files loaded - use this hook for theme stuff
do_action( 'after_setup_theme' );
// ...rendering happens...

Quelque part entre les deux, WP core configure des ensembles de données globally différents dans des variables globales. Certains sont définis lors du rendu, d'autres avant, etc. En d'autres termes, lorsque vous écrivez un plugin et déposez simplement du code dans la nature (pas dans un rappel attaché à un hook ou à un filtre), il est alors très incertain de savoir où il va apparaître. Dans votre exemple, éventuellement, avant que plugins_loaded soit appelé. Le résultat est soit une erreur PHP (variable non définie), soit simplement quelque chose de vide, car la variable n'a pas été renseignée.

Conclusion:Always!Placez votre code dans les rappels attachés aux crochets et aux filtres (appropriés). Dans la plupart des cas, cela signifie un peu de shotgun debugging et attachez vos rappels à différents crochets/filtres que vous trouverez en suivant la procédure de chargement de base avec la lecture de fichiers de base.

Raccourci vers les données disponibles dans l’administrateur et sur le raccordement duquel il est disponible via le répertoire wecodemore/"Current Admin Info" .

5
kaiser