2012-10-18 4 views
0

J'essaie de passer une action ajax à /wp-admin/admin-ajax.php, mais je n'arrive pas à l'appeler pour appeler des fonctions qui utilisent une classe pour encapsuler l'espace de noms. Je reçois l'erreur suivante:wp_ajax_ actions qui utilisent des gestionnaires d'actions orientés objet?

Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'PHP_faq_backend' not found in /wp-includes/plugin.php 

Mon action se présente comme suit:

add_action('wp_ajax_edit_form', array('PHP_faq_backend', 'edit_form')); 

Évidemment, je ne veux pas forcer en modifiant le fichier admin-ajax.php, mais comment puis-je obtenir mes classfiles chargés pour que l'action fonctionne?

+1

les inclure avec votre plugin. – hakre

Répondre

2

Assurez-vous que vous incluez vos fichiers de classe quelque part dans votre thème Wordpress (functions.php) ou plug-in.

J'utilise habituellement quelque chose comme ça;

<?php 
class Some_Class { 

    public function __construct() { 
     //logged in users 
     add_action('wp_ajax_some_method', array($this,'some_method')); 
     //non logged in users 
     add_action('wp_ajax_nopriv_some_method', array($this,'some_method')); 
    } 

    public function some_method(){ 
     //check nonce values etc 
     if (! isset($_REQUEST['some_nonce']) || ! wp_verify_nonce($_REQUEST['some_nonce'], 'class_some_nonce')) { 
      wp_die(__('Naughty', 'some-class-textdomain')); 
     } 

     //proceed with post data validation - then execute method 
    } 

} 

$some_class_instance = new Some_Class(); 
?> 

Ce qui précède est pour enregistrer des actions depuis une instance de classe.

+0

J'utilisais une approche OO avec plusieurs classes et ce classfile particulier n'était pas inclus quand je m'attendais. J'ai pris un peu de débogage mais je l'ai résolu. Merci pour les suggestions - ceci est un exemple solide de la façon dont les appels wp_ajax_ devraient ressembler à un plugin OO! – blackbourna

0

La dernière partie du message d'erreur est votre premier indice. J'ai eu ce même problème sur plusieurs versions de WP. Dans certains environnements, l'installation ne reconnaît pas les classes tierces. Il y a une couple de choses que vous pouvez probablement faire pour essayer de résoudre ce:

  1. Vérifiez les autorisations sur vos fichiers de classe pour voir si vous avez des droits suffisants
  2. Vérifier que vos cours sont chargés, par exemple inclure explicitement les dans votre fichier functions.php (pas une méthode idéale ou recommandé)

La seule solution que j'ai trouvé travaillé toujours est la suivante:

  1. Créer un plugin squelette que vous devez activer via le gestionnaire de plugins
  2. Votre fichier de plugin doit inclure toutes les classes que vous souhaitez utiliser.
  3. Activez votre plugin. Terminé.

Cette approche peut être accomplie de deux manières différentes; la première est que vous pouvez définir un répertoire plugin qui réside dans votre répertoire de thème actuel - cela vous permet de conserver tous vos fichiers ensemble; la seconde est d'aller sur la route normale et créer un dossier plugin sous wp-content/plugins/my-skeleton-plugin. Voici un plugin squelette pour vous aider à démarrer si vous passez par cette approche:

<?php 
/* 
Plugin Name: Skeleton Plugin Base 
Plugin URI: http://www.yourdomain.com 
Description: This is a base plugin to use as a template for other plugins. 
Author: Author Name 
Version: v0.0.1 
Author URI: http://www.yourdomain.com 
*/ 

    # +------------------------------------------------------------------------+ 
    # PLUGIN URL AND PATH CONSTANTS 
    # +------------------------------------------------------------------------+ 
    /** 
    * Don't depend on WP to always provide a consistent directory/path to use. 
    * Extrapolate one the location of this file. The reason for this is that some 
    * themes might re-locate the plugins and themes directory to another folder 
    * and therefore break the normal WP structure. 
    */ 
    define(DS, DIRECTORY_SEPARATOR, true); 

    $PLUGIN_URL = WP_PLUGIN_URL . DS . str_replace(basename(__FILE__),'', plugin_basename(__FILE__)); 
    $PLUGIN_DIR = dirname(__FILE__); 

    define(MY_PLUGIN_URL, $PLUGIN_URL, true); 
    define(MY_PLUGIN_DIR, $PLUGIN_DIR, true); 


    # +------------------------------------------------------------------------+ 
    # INCLUDES 
    # +------------------------------------------------------------------------+ 
    /** 
    * Include the plugin. 
    */ 
    // Use include() if you prefe 
    include_once(MY_PLUGIN_DIR . '/inc/classes/my_skeleton_plugin.class.php'); 

    try 
    { 

     /** 
     * Initialize the plugin 
     */ 

    } 
    catch(Exception $e) 
    { 
     throw $e; 
    } 
Questions connexes