0

/wp-admin/admin-ajax.php に ajax アクションを渡そうとしていますが、クラスを使用して名前空間をカプセル化する関数を呼び出すことができないようです。次のエラーが表示されます。

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

私の行動は次のとおりです。

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

明らかに、admin-ajax.php ファイルを変更してこれを強制したくありませんが、アクションが機能するようにクラスファイルをロードするにはどうすればよいですか?

4

2 に答える 2

2

Wordpress テーマ (functions.php) またはプラグイン内のどこかにクラス ファイルを含めていることを確認してください。

私は通常、このようなものを使用します。

<?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();
?>

上記は、クラスインスタンス内からアクションを登録するためのものです。

于 2012-10-18T20:02:20.157 に答える
0

エラー メッセージの最後の部分が最初の手がかりです。WP の複数のバージョンで同じ問題が発生しました。一部の環境では、インストールでサードパーティのクラスが認識されません。これを解決するために、おそらくできることがいくつかあります。

  1. クラス ファイルのアクセス許可をチェックして、十分な権限があるかどうかを確認します
  2. クラスがロードされていることを確認します。たとえば、明示的に functions.php ファイルに含めます (理想的または推奨される方法ではありません)。

私が見つけた1つの解決策は常にこれです:

  1. プラグイン マネージャーを介してアクティブ化する必要があるスケルトン プラグインを作成します。
  2. プラグイン ファイルには、操作するすべてのクラスが含まれている必要があります。
  3. プラグインを有効にします。終わり。

このアプローチは、いくつかの異なる方法で実現できます。1 つ目は、現在のテーマ ディレクトリに存在するプラグイン ディレクトリを定義できることです。これにより、すべてのファイルをまとめて保持できます。2 つ目は、通常のルートに進み、 の下にプラグイン フォルダを作成することwp-content/plugins/my-skeleton-pluginです。このアプローチを実行する場合に開始するためのスケルトン プラグインを次に示します。

<?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;
    }
于 2012-10-18T14:47:19.070 に答える