質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

WordPressでAjaxを使う方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 982

test21

score 24

ajaxをトリガーに、wordpressの関数を実行させたいのですができないでいます。

ajax実行後のalertの"データ保存: "は表示される状態です。

wordpressの関数内容は
wordpressのテーマをzipにしダウンロードするものです。
ダウンロードする際にhttpリクエストを使用するのでajaxの使用がよくないのかなと思っていますが
ajax、javascriptに強くないので何が原因か、あたりもつけられないでいます。

なにかわかる方がいましたらご教授いただけるとありがたいです。

js

($=>{
  $.ajax({
    type: 'post',
    url: ajaxurl,
    data: {
      action: 'backup_data_setting',
    }
  }).done(function() {
      alert( "データ保存: ");
  });
})(jQuery);

wordpress

function backup_data_setting() {
  // zipファイル名
  $fileName = "test-zipFile";
  // 圧縮対象フォルダ
  $bp_path = dirname(__FILE__);
  $compressDir = str_replace("/functions", "", $bp_path);

  // zipファイル保存先
  $zipFileSavePath = str_replace("/テーマ名", "", $compressDir);

  // コマンド
  // cd:ディレクトリの移動
  // zip:zipファイルの作成
  $command =  "cd ". $compressDir .";".
          "zip -r ". $zipFileSavePath . $fileName .".zip .";

  // Linuxコマンドの実行
  exec($command);

  //圧縮したファイルをダウンロードさせる。
  header('Pragma: public');
  header("Content-Type: application/octet-stream");
  header("Content-Disposition: attachment; filename=".$fileName.".zip");
  readfile($zipFileSavePath.$fileName.".zip");

}
add_action( 'wp_ajax_backup_data_setting', 'backup_data_setting' );

※jsは実際はボタンをクリックして上記のjsを実行するようにしてあります。
※管理画面向けのもののため、ログインしている状態からの動作です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Ajaxは非同期で通信し、結果を .done(function(data) {}) で受け取るため、受け取ったバイナリを再度ダウンロードできる形に変換する必要があります。

【バイナリファイルをAjaxで取得する際に注意する点 - Qiita】
http://qiita.com/tom_konda/items/484955b8332e0305ebc4


ダウンロードさせるのが目的であれば、それのためのURLを作ったほうが早いと思います。

【Rewrite APIその2 WordPressでアプリを作る基本(WordPressプラグイン開発のバイブルのボツ原稿から) – Shinichi Nishikawa's】
http://nskw-style.com/2014/wordpress/wordpress-app-with-rewrite-api.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/15 11:56

    ご回答いただきましてありがとうございます。
    提示していただいたサイト確認します。

    >結果を .done(function(data) {}) で受け取るため

    ajaxで指定した関数に飛び、関数内容を実行した後(zipファイルダウンロード後)その結果を受け取る認識でいたのですが(なのでなにも受け取らない)
    その認識は間違っていますでしょうか。

    キャンセル

  • 2016/09/15 12:02

    すいません、「関数内容を実行した後」がなにを指しているのかがわかりません。

    doneの中で指定しているfunctionの引数として結果(zipバイナリ)がテキストで返ってくる仕様です。なので、ブラウザはzipを受け取ってはいますが、ダウンロードという形で受け取っているわけではありません。

    キャンセル

  • 2016/09/15 12:22

    ご回答いただきましてありがとうございます。

    >「関数内容を実行した後」
    backup_data_setting()で
    readfile($zipFileSavePath.$fileName.".zip"); で
    強制的にダウンロードした後、なにもデータを持たず
    .done(function(data) {})に結果が行く認識でした。

    キャンセル

+1

wp_ajax_nopriv_XXXXアクションがないですので、恐らくログインユーザー以外は実行できないでしょう。WordPressでのAjaxのやり方は、以下の記事が参考になります。

 追記

素直に、Download Managerなどのプラグインを使った方がよいように思いますがいかがでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/15 11:30

    説明が足りず、すみません。
    ログインしている状態からの動作です。
    質問に補足します。

    キャンセル

  • 2016/09/15 11:36

    どちらでもよいのですが、ご提示のソースコードではセキュリティ的にも危険な気がしますので、今一度、私が回答に記した参考サイトをご覧になっていただき、WordPressでAjaxを使う時の定石をご確認いただいた方がよいように思います。

    キャンセル

  • 2016/09/15 11:39

    アドバイスありがとうございます。
    >セキュリティ的にも危険な気が
    本当にそうですね…、焦ってすぐに修正しました!
    ご親切にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる