サポート » 使い方全般 » ワードプレスの出力HTMLの保存

  • 解決済 yokudekiru

    (@yokudekiru)


    ワードプレスが出力するHTML自動でファイルに保存しておくために以下のようなコードをfunctions.phpに書きました。

    //フィルターフックtemplate_includeを使います。$templateには呼びたすテンプレートへのパスが入っています。
    add_filter( 'template_include',function ( $template ) {
    
        //HTMLの取得
        ob_start();
        include $template;
        $html = ob_get_contents();
        ob_end_clean();
    
        /*ここに保存処理が入る*/
    
        echo $template;
    
        return false;
    
    } , 0 );

    このコードでHTMLを取得、保存はできました。
    しかし、なぜかコメントが有るページでは、HTMLの途中(コメント部分のHTML)からの部分しか、保存できていませんでした。
    さらに調べてみると、保存処理は正常に動いていてob_start(); ~ ob_end_clean();のHTMLを取得する部分がおかしいようでした。また、プラグインを無効化したり、テーマを変えたりしましたがこの問題はなおりませんでした。

    そこでですが、私の書いたコードのおかしい点や気になる点などあったら教えてもらえませんか?
    もしくは、他にワードプレスが出力するHTMLを自動でファイルに保存しておくコード等ありましたら教えて下さい。
    お願いします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター jim912

    (@jim912)

    しかし、なぜかコメントが有るページでは、HTMLの途中(コメント部分のHTML)からの部分しか、保存できていませんでした。

    差異としては、変数の扱いが考えられます。wp-includes/template-loader.php で行われる include はグローバルのスコープで行われるため、テンプレート内もグローバルとなります。
    フック内で行われる include に関しては、関数内のローカルとなるため、テンプレート内もローカルのスコープとなります。

    これによる処理結果の差異は十分に考えられます。

    もしくは、他にワードプレスが出力するHTMLを自動でファイルに保存しておくコード等ありましたら教えて下さい。

    ob_start では、オプションの引数 output_callback 関数を指定することが可能です。特定ポイントでob_start しておいて、最終の出力時に、コールバック関数で保存処理をすることが可能です。ページキャッシュプラグインは、この手法を使うことも多いです。

    また、今回はフィルターフック内でテンプレートを読み込んで、保存処理を行っていますが、フィルターフックは引数で得られる値を改変するためのもので、関数内でこれ以外の処理を行うのは、本来の意図から外れてしまいます。

    プラグインとして、将来のバージョンに渡って問題の発生を最小限に留めるためには、WordPress 本体が意図したことに、極力従った方がよいでしょう。

    template_includeフィルターフックを使ったことはないのですが、デンプレートが多重に呼び出されている場合はどうなりますでしょうか。

    コメントがある場合は投稿のデンプレート中からコメントのデンプレートが呼び出されたりしていませんでしょうか。

    デンプレートが呼び出された際に実行されるとなると ファイル名が同じだと、入れ子になっ 最も内側のデンプレートが呼び出された際に上書きされてしまいます。

    テーマの処理構成と保存処理もわからまいままの予測回答ですいません。

    こんにちは、

    Simply Staticという、MTのように、サイトの静的htmlを保存するプラグインがあるので、そういったものを参考にしてみてはどうでしょうか?

    使い方は、

    Setting / General / Destination URL で 保存先URLを指定して

    例 http://example.com/wordpress/ なら

    http://example.com/example/ 等に指定

    http://example.com/wordpress/example/ は X

    Generate で Generate Static Files ボタンを押して、

    コーヒー飲んで待っていると、

    テキストエリアに、処理終了のメッセージが出るので、
    Click here to download をクリックして、ファイルをダウンロードして、

    指定したURLにアップロードすれば完了です。

    トピック投稿者 yokudekiru

    (@yokudekiru)

    jim912さん

    ob_start では、オプションの引数 output_callback 関数を指定することが可能です。特定ポイントでob_start しておいて、最終の出力時に、コールバック関数で保存処理をすることが可能です。ページキャッシュプラグインは、この手法を使うことも多いです。

    今回はフィルターフック内でテンプレートを読み込んで、保存処理を行っていますが、フィルターフックは引数で得られる値を改変するためのもので、関数内でこれ以外の処理を行うのは、本来の意図から外れてしまいます。

    いろいろと詳しい解説ありがとうございました。
    ご指摘を受けて、output_callback 関数とアクションフックを使って、HTMLの保存をするコードを書いてみました。

    function callback_html( $buffer ) {
        /*保存処理*/
        return $buffer;
    }
    //テンプレートの読み込みの初めでob_startし、HTML取得
    add_action( 'template_redirect', function() {
            ob_start('callback_html');
    });
    add_action( 'shutdown', function() {
            ob_end_flush();
    });

    結果、コメントのあるページでも、HTMLを取得することができました!
    しかし、結構適当に書いたコードなので、もしまた悪いところとうあれば教えてください。

    munyaguさん

    デンプレートが呼び出された際に実行されるとなると ファイル名が同じだと、入れ子になっ 最も内側のデンプレートが呼び出された際に上書きされてしまいます。

    ありがとうございます。
    調べてみたのですが、私のテーマでは、コメントがあるからといって新たにテンプレートが呼ばれることはないみたいです。

    nobitaさん

    Simply Staticという、MTのように、サイトの静的htmlを保存するプラグインがあるので、そういったものを参考にしてみてはどうでしょうか?

    そういうプラグインもあったのですね!
    しかし、そのプラグインは手動でやるみたいなので、自動でHTMLを保存するのとはちょっと違うみたいです。

    皆さん本当に回答ありがとうございました。とりあえず、jim912のアドバイスのおかげで目的を達成することができたので、トピックを解決積みとさせていただきます。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「ワードプレスの出力HTMLの保存」には新たに返信することはできません。