J'ai une classe parente, qui contient les éléments suivants:
use app\My_Dashboard;
class My_Class {
public function __construct() {
add_action('admin_menu', array($this, 'setup_dashboard_page'));
}
public function setup_dashboard_page() {
My_Dashboard::add_dashboard_page();
}
}
Et la classe qui a les fonctions de la page admin:
class My_Dashboard {
public static function add_dashboard_page() {
add_menu_page('My Settings', 'My Settings', 'my-settings', array($this, 'dashboard_page_cb'));
}
public function dashboard_page_cb() {
//The markup
}
}
Cette approche ne fonctionne pas et je ne peux pas voir mon article de menu administrateur ni ma page ajoutée. La deuxième approche que j'ai essayée:
use app\My_Dashboard;
class My_Class {
public function __construct() {
add_action('admin_menu', array($this, 'setup_dashboard_page'));
}
public function setup_dashboard_page() {
//Not very sure of the syntax, bad at OOP
add_menu_page('My Settings', 'My Settings', 'my-settings', 'My_Dashboard::dashboard_page_cb');
}
}
Comment puis-je le faire fonctionner? Mon idée est de séparer tous les éléments liés au tableau de bord à l'autre classe.
Mise à jour: La première approche a fonctionné et l'élément de menu est ajouté. Mais la fonction de rappel qui génère le balisage de page ne semble pas fonctionner. J'ai vérifié les fautes de frappe mais tout semble bien aller.
Je déteste OOP mélangé à la structure fonctionnelle de wordpress (voici les votes négatifs .....). Si vous utilisez OOP uniquement pour l'espacement des noms, utilisez simplement la fonction d'espacement des noms de PHP. Le fait de placer une fonction dans une classe ne représente qu'une toute petite partie de ce que OOP devrait être.
Quoi qu’il en soit, votre problème est qu’il n’existe que deux méthodes pour faire référence à une méthode de classe, soit quand elle est associée à un objet spécifique , soit si elle est statique dans la classe (fondamentalement associée à la classe mais pas à la objets). Dans votre code, vous essayez de traiter une fonction liée à un objet comme s'il s'agissait d'une fonction statique (je suis sûr que si vous vérifiez votre journal des erreurs, vous verrez une erreur pertinente). Il existe deux façons possibles de le résoudre: 1. Rendez les fonctions pertinentes statiques et utilisez la syntaxe de votre deuxième variante 2. utilisez un modèle singleton, instanciez un objet de la classe de tableau de bord, conservez-le en tant que global et utilisez-le à la place nom dans ta première variante au lieu de
public function setup_dashboard_page() {
My_Dashboard::add_dashboard_page();
}
faire
global $dashboard;
$dashboard = new my_dashboard()
.....
public function setup_dashboard_page() {
global $dashboard;
$dashboard->add_dashboard_page();
}
Et toujours déboguer le code avec le rapport d’erreur complet et corriger toutes les erreurs et les avis;)
Exemple de travail
class PluginSkeleton {
public function __construct(){
add_action('admin_menu',array($this,'pluginskeleton_menu'));
}
public function pluginskeleton_menu(){
add_menu_page( 'Application Users', 'Application Users', 'manage_options', 'application-users.php',array($this,'application_users_page'));
}
public function application_users_page(){
echo 'i am here';
}
}
utiliser $ this avec la fonction de rappel
add_menu_page( 'Application Users', '...', ...', '...',array($this,'application_users_page'));