web-dev-qa-db-ja.com

このAjaxが機能しないのはなぜですか?

このようにしてWordPressとAjaxを悪用しているのかどうかはわかりませんが、 WPとAjax CodexAjaxを使用したプラグイン開発 あまり役に立ちません。私は以下のAjaxシチュエーションを作成しました。

(function($){   
    $(document).ready(function(){
        $('a').click(function(e){
          var el = $(this).prev('input[type="checkbox"]');
          if(el.is(':checked')){
               el.prop('checked',false);   
          }
          $.ajax({
              url  : "<?php echo CORETHEME_ADMIN_TEMPLATE_HELPER_URL . 'UncheckPackageThemeHelper.php'; ?>",
              type : 'POST',
              data : { 'element_name' : el.prop('name') },      
              success: function(result){
                console.log(result);
              },
              error: function(jqXHR, textStatus, errorThrown ){
                console.log(jqXHR, textStatus, errorThrown);
              } 
          });
          e.preventDefault();
        });
    }); 
 })(jQuery);

リンクをクリックすると、チェックボックスがオフになり、その要素名がクラスに渡されます。

私のクラスにunset_packageメソッドが表示されるまで、すべてうまくいきます。

class CoreTheme_AdminPanel_Template_Helper_UncheckPackageThemeHelper{

    private $_element_name = null;

    public function __construct(){
        if(isset($_POST["element_name"])){
            $this->_element_name = $_POST["element_name"];
            $this->unset_package();
        }
    }

    public function unset_package(){
        $option = get_option($this->_element_name);
        if(isset($option)){
            $option = '';
        }
    }
}

new CoreTheme_AdminPanel_Template_Helper_UncheckPackageThemeHelper();

get_optionまではすべてうまくいきます - 私は500エラーを受け取ります。この場合はget_option()メソッドが存在しないことを意味します。 get_optionとそれ以外の部分を取り出してunset_packageの内容を置き換えたら

echo json_encode($this->_element_name);ですべてがうまくいき、要素名が返されます。

誰かがこれがうまくいかない理由を説明して、おそらく私に適切なWordPressの方法を見せてもらえますか?ドキュメンテーションは控えめに言っても非常に混乱していました。

1
TheWebs

あなたが直接ajaxリクエスト(UncheckPackageThemeHelper.php)を通してphpファイルをロードするとき、それはWordPressの文脈の外でロードされるので、WordPressのコア機能は利用できません。

すべてのWordPress ajaxリクエストはadmin-ajax.phpを通してルーティングされるべきです。 URLを印刷するには、 admin_url のようにします。

admin_url( 'admin-ajax.php' )

admin-ajax.phpがロードされると、WordPressがブートストラップされるので、コア機能にアクセスできるようになります。

最後のステップは、JavaScriptからactionパラメータを渡し、そのアクションが実行されたときに呼び出したい関数にマッピングすることです。

add_action( 'wp_ajax_my_action', 'my_action_callback' );
3
Milo