• 解決済 吉田 丈治

    (@geeorgey)


    https://ja.forums.wordpress.org/topic/156984?replies=4

    ここにあるような事をfunctions.phpにベタ書きして処理していたのですが、どうにも不格好だなと思い、以下のようにhookに含めました。

    function FileDL(){
    //研究費の一括ダウンロードスクリプトDefine bulk actions for custom-post-type customPostType
    $bulk_actions = new Seravo_Custom_Bulk_Action(array('post_type' => 'customPostType'));
    
    //ACTION
    $bulk_actions->register_bulk_action(array(
        'menu_text'=>'ファイル一括ダウンロード',
        'admin_notice'=>'ダウンロードが完了しました',
        'callback' => function($post_ids) {
    
        // Zipクラスロード
        $zip = new ZipArchive();
        // Zipファイル名
        $zipFileName = 'customPostType'. date("Ymd") . '.zip';
        // Zipファイル一時保存ディレクトリ
        $zipTmpDir = '/tmp/';
    
        // Zipファイルオープン
        $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
    
        // ファイルをZipに突っ込む処理
        foreach ($post_ids as $post_id) {
            $docURL = get_post_meta($post_id,'docURL',true); //docURLはファイルのURLが入ったカスタムフィールドです
            if(empty($docURL)){}else{
            $docPATH = str_replace("https://mydomain.com","/var/www/html/mydomain",$docURL); //内部パスに変換
            $filename = basename($docPATH);
            $zip->addFromString($filename,file_get_contents($docPATH));
            }
        }
    
        // 処理制限時間を外す
        set_time_limit(0);
    
        $zip->close();
    
        // ストリームに出力
        mb_output_handler("pass");
        mb_http_output("pass");
        header('Content-Type: application/zip; name="' . $zipFileName . '"');
        header('Content-Disposition: attachment; filename="' . $zipFileName . '"');
        ob_end_clean();
            $handle = fopen($zipTmpDir.$zipFileName, 'rb');
            while (!feof($handle))
            {
                echo fread($handle, 1024*4);
                ob_flush();
                flush();
            }
            fclose($handle);
        // 一時ファイルを削除しておく
        #unlink($zipTmpDir.$zipFileName);
        exit("終了");
    
    }));
    
    //Finally init actions
    $bulk_actions->init();
    }
    add_action('admin_head-edit.php', 'FileDL' );

    hookによって、customPostTypeページのバルクアクション部分に、ここで定義した「ファイル一括ダウンロード」が表示されていることは確認しておりますが、一括処理のボタンを押してもファイルのダウンロードが始まりません。
    /tmp/以下に一時ファイルも出来ないので、そもそもzipにファイル投入が成されていないようです。

    $post_idsがうまく渡っていないのかなと思い、function FileDL($post_ids)としてみたのですが動かずでした。
    どのあたりがまずいのでしょうか。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • 動作検証までしたわけではありませんが、Custom Bulk Actions が register_bulk_action で登録されたコールバックを実行するタイミングは、load-edit.php というアクションになっています。

    設定されているフックの admin_head-edit.php は、これより遅いタイミングで実行されますので、load-edit.php 時点では、コールバック自体が登録されておらず、実行されないのではないかと思われます。

    トピック投稿者 吉田 丈治

    (@geeorgey)

    jim912さん

    レスありがとうございます!
    呼び出しの順番のせいだったんですね。
    一般的な話として教えていただきたいのですが
    1:タイミングを確認するには、プラグインのファイルを見てアクションフックを確認するということで良いでしょうか(ソース見てみましたら以下の行があったのでこれを指しているということだと思うのですが)
    add_action('load-edit.php', array(&$this, 'custom_bulk_action'));

    2:hookのアクションの実行タイミングみたいなものは、wordpressのWiki等にありそうなのですが、どこにあるのか教えて下さい

    3:そして肝心な部分なのですが、こういったことをやる場合、どこのhookに引っ掛ければよいでしょうか…2が分からず連動した質問になってしまうのですが。

    分からないことだらけで恐縮なのですが、お知恵をいただければ助かります。

    順番のせいかどうか、また全ての要因かどうはまで確認はしていませんので、改めて検証してみてください。

    ご質問の件ですが

    1. それが一番確実ではあります。あと、使ったことはありませんがこんなプラグインもありますね。
    https://ja.wordpress.org/plugins/debug-bar-actions-and-filters-addon/

    2. 全てではありませんが、
    https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7
    ですね。基本的に実行順に記述されています。

    3. admin_init あたりでいかがでしょうか。

    トピック投稿者 吉田 丈治

    (@geeorgey)

    jim912さん

    ありがとうございます。
    1:コード読んでみるのが確実。そうですね、以後はそうしてみます。

    2:ここのページ実行順だったのですね!!!素晴らしい助言ありがとうございます。

    3:行けました!!!

    何から何までアドバイスありがとうございます。今後の役に立ちそうです。助かりました!!

4件の返信を表示中 - 1 - 4件目 (全4件中)

トピック「hookの中にスクリプトを入れるとうまく呼び出せない」には新たに返信することはできません。