IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WordPress PHP Discussion :

Warning: call_user_func() expects parameter 1 to be a valid callback


Sujet :

WordPress PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2012
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Warning: call_user_func() expects parameter 1 to be a valid callback
    Bonjour tout le monde,

    je découvre le Wordpress. J'essaye de créer un thème par étape.

    Mon niveau PHP date de PHP4. J'ai retrouvé quelques automatismes mais c'est pas encore ça

    J'essaye de créer de nouvelles options pour permettre à l'utilisateur de configurer mon thème.
    Cela fonctionne mais j'ai quelques warning/errors.

    je me suis basé sur le tuto de grafikart :


    j'arrive à ce résultat :
    Nom : erreur php— WordPress.png
Affichages : 347
Taille : 16,3 Ko


    voici le code que j'ai mis (je compte mettre un tableau et une boucle quand j'aurais corrigé mes soucis) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
     
        public static function registersettings() {
            add_settings_section('HH_options_section','Parametres',function (){
                echo "Vous pouvez gérer les options du site";
            },self::GROUP); 
     
     
            $nomduchamp = 'company_adresse';
            $intituledhchamp = "Adresse complète";
            $fieldName= 'HH_options_adresse';
            register_setting( self::GROUP, $nomduchamp);
            add_settings_field($fieldName,$intituledhchamp,self::getchamp($nomduchamp),self::GROUP,'HH_options_section');
     
            $nomduchamp = 'company_telephone';
            $intituledhchamp = "Téléphone";
            $fieldName= 'HHl_options_telephone';
            register_setting( self::GROUP, $nomduchamp);
            add_settings_field($fieldName,$intituledhchamp,self::getchamp($nomduchamp),self::GROUP,'HH_options_section');
        }
     
        public static function getChamp(string $nomduchamp) 
        {
     
             return '<input type="text" name="'.$nomduchamp.'" value="'.esc_html(get_option($nomduchamp)).'" style="width:100%">';
     
        }
    j'ai fait des recherches. Je trouve des sites mais je ne comprends pas comment l'appliquer sur mon code.

    Si vous pouviez m'aider. Cela serait super.

    Merci d'avance
    Olivier :-)

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Bonjour,

    Cette erreur veut dire que, d'une manière ou d'une autre, vous essayez d'appeler une fonction callback cependant cette fonction n'existe pas (soit car elle n'existe vraiment pas, soit car c'est mal écrit)

    Exemples :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    // Utilisation avec un namespace
    namespace MonNamespace;
     
    function monCallback() {}
    add_action('wp', __NAMESPACE__.'\\monCallback');
     
    // Utilisation avec une class
    Class MaClass {
        public function __construct() {
            add_action('wp', [$this, 'maMethodCallback'];
        }
     
        public function maMethodCallback() { // Attention, la méthode DOIT être publique
            // Instructions ...
        }
    }
    new MaClass();


    Si on considère que add_settings_field() prend un callback en 3e paramètre, il faudrait s'assurer que self::getchamp($nomduchamp) soit correct.
    A priori, je dirais que ce n'est pas le cas car il me semble qu'on ne peut pas utiliser self mais plutôt le nom de la classe. (De plus si le fichier est situé dans un namespace, il faudra évidemment ajouter le namespace complet.)
    Sans namespace : maClasse::getchamp($nomduchamp).
    Avec namespace : \\Nom\\Complet\\du\\Namespace\\maClasse::getchamp($nomduchamp)

  3. #3
    Membre à l'essai Avatar de sisier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    merci pour ton aide.

    Je n'ai pas de Namespace.

    Comme tu mas conseillé, j'ai essayé de modifier self par le nom de la classe mais sans succès.
    J'ai également essayé d'autres façon d'écrire ma fonction sans aucun succès (peut-être mon manque de connaissance en PHP)

    pour le coup, je me suis résigné à répéter pour chaque champs l'ensemble des lignes (sans faire de fonction).
    Je n'ai pas énormément de champs mais je voulais le faire proprement.

    Voici ce que cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $intituledhchamp = "Téléphone";
            $fieldName= 'HH_options_telephone';
            register_setting( self::GROUP, $nomduchamp);
            add_settings_field($fieldName,$intituledhchamp,function() {
                ?>
                 <input type="text" name="company_telephone" value="<?php echo esc_html(get_option('company_telephone')); ?>" style="width:100%">
                <?php
            },self::GROUP,'HH_options_section');
        }

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 408
    Points : 15 775
    Points
    15 775
    Par défaut
    pour factoriser le code de génération du champ, vous pouvez créer une nouvelle action comme cela par exemple :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    <?php
     
    const CODE_PAGE_TEST1 = "code_page_test1";
    const CODE_SECTION1 = "code_page_test1__section1";
     
    const LISTE_CHAMPS = [
    	[
    		"code_champ" => "HH_options_adresse",
    		"titre" => "Adresse complète",
    	],
    	[
    		"code_champ" => "HH_options_telephone",
    		"titre" => "Téléphone",
    	],
    ];
     
     
     
    add_action("mon_extension/generer_champ_texte", function ($arguments) {
     
    	?>
    		<input
    			type="text"
    			name="<?php echo htmlspecialchars($arguments["code_champ"]);?>"
    			value="<?php echo htmlspecialchars(get_option($arguments["code_champ"]));?>"
    		/>
    	<?php
     
     
    }, 10, 1);
     
     
    add_action("mon_extension/generer_page_test1", function () {
     
    	add_settings_section(CODE_SECTION1, "Paramètres", NULL, CODE_PAGE_TEST1);
     
     
    	foreach (LISTE_CHAMPS as $champ) {
     
    		register_setting(
    			  CODE_PAGE_TEST1
    			, $champ["code_champ"]
    		);
     
    		add_settings_field(
    			  $champ["code_champ"]
    			, $champ["titre"]
    			, function ($arguments) {
    				do_action("mon_extension/generer_champ_texte", $arguments);
    			}
    			, CODE_PAGE_TEST1
    			, CODE_SECTION1
    			, $champ
    		);
     
     
    	}
     
     
    	// affichage des champs
    	do_settings_sections(CODE_PAGE_TEST1);
     
    });
     
     
    add_action("admin_menu", function () {
     
    	add_menu_page(
    		  "Titre page Test 1"
    		, "Titre page Test 1"
    		, "manage_options"
    		, CODE_PAGE_TEST1
    		, function () {
    			do_action("mon_extension/generer_page_test1");
    		}
    	);
     
     
    });

    pour plus d'informations sur les fonctions utilisées, vous pouvez regarder la documentation officielle là :
    https://developer.wordpress.org/reference/

Discussions similaires

  1. Problème: Warning: stripslashes() expects parameter
    Par Sarah sh dans le forum Langage
    Réponses: 7
    Dernier message: 19/03/2012, 10h16
  2. Réponses: 5
    Dernier message: 14/12/2011, 07h38
  3. [MySQL] Warning: mysql_result() expects parameter 1 to be resource ..
    Par camyo dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 01/07/2010, 12h00
  4. [MySQL] Message : Warning: mysqli_free_result() expects parameter 1 to be mysqli_result
    Par Alexandrebox dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 18/02/2009, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo