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

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

ただいまの
回答率

87.77%

自己作成PHPファイルからワードプレスへの記事投稿。ブラウザで実行すると出来るものがcronに登録してcronから実行すると出来ない。

受付中

回答 1

投稿

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

score 30

さくらVPSにappache,php,phpMyAdmin,ワードプレス、等々をインストールしまして、
wp_insert_post関数を用いたphpファイルを作成して
cronで定期実行をしてワードプレスに投稿するプログラムを作成しています。

タイトルではブラウザで実行できるphpプログラムが、
cronに登録すると【出来ない】 と書かせて頂きましたが、
詳細については、【出来ないのではなくて、不十分な内容なら一応投稿される】、というものです。

具体的には、
自分のPCでグーグルクロームでPHPファイルを実行する →しっかりワードプレスに投稿される

全く同じものをVPSでcronに登録して定期実行の形で実行すると、
ワードプレスに、javascriptタグの宣言部分がカットされてしまい、閉じる方の</scirpt>等もカットされて
jqueryなどの記載した function云々がただのテキスト、文字として投稿されてしまい
javascript系が使えないというのが現在の抱えている問題点です。
そして追加実験としてcssタグもやってみましたが、
ブラウザ実行ではワードプレスに全て反映、
肝心なcronからの自動実行では反映されない、状態でした。

<style type="text/css">   ←ここ
~~~~~
~~~~~~
</style>  ←ここ




<script type="text/javascript">  ←ここ
~~~~~
~~~~~~
~~~~~~~~
</script>  ←ここ

「ここ」という場所が投稿されないため、ただのテキスト文字として記事に出てしまい、cssやjavascriptが反映されない状態です。

「ブラウザで実行できるものがcronだと投稿できない 失敗」
「ブラウザで投稿できるもの cronだと 失敗 wordpress」
などこういった形で検索をすると
自分とは違いましたが
cronからのメール送信が文字化けをする、などの例もあったりで
環境変数が違ったり、文字コードを正しく設定、などあり

なるほどなるほど・・など分かったような分からないような、↓こういった、
php.iniのmbstring.internal_encoding という場所をutf-8としてみたり
cronファイルの冒頭に、LANG=ja_JP.UTF-8と記載をしてみたり、

など見よう見まねで修正を試みてみましたが、
変わりませんでした。

ここで、
wp_insert_post関数を用いた方法でなく、その他外部作成APIプログラムなどあるかとは思いますし、
直接ワードプレスのデータ部分に INSERTしてしまうようなプログラムの作成の路線もあるとは少し検索したら
色々他路線もあるとは思うのですが、

現状、自分のPCのブラウザからは <script type="text/javascript"> と投稿できるものを
cronからも投稿できれば目標達成となりますので、
どうかご指導頂けたらと思います。よろしくお願い致します;

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2019/06/18 11:44 編集

    エラーや警告は、出ていないでしょうか?
    cron の場合は、cron を実行したユーザー宛にメールが送信されていると思われます。

    もしくは、cron の実効ユーザーでログインして、cronで、実行しているコマンドを コマンドラインから入力して実行するとどうなるでしょうか?

    HTMLタグがエスケープされている等の感じもしますが、文章から原因を推測するより、ソースコード等を確認するほうが、原因を確認しやすい場合が多いので、ソースコードを質問に記載していただくことは可能でしょうか? (個人情報や ID / Password 等は適当な文字列に置き換えてください。)

    キャンセル

  • gugupoo

    2019/06/18 14:09

    遅くなりまして申し訳ありません。

    /////////////////////////////////////////////////////////////////////////////////////////////////


    $text1 = "
    <style type='text/css'>
    body {background:red;
    }
    </style>


    <script src='http://code.jquery.com/jquery-1.12.4.min.js&#039;></script>


    <script type='text/javascript'>
    var params = [];
    var param = location.search.substring(1).split('&');
    for(var i = 0; i < param.length; i++) {
    params[i] = param[i].split('=');
    }

    var target = 'pattern';
    var value;
    for(var i = 0; i < params.length; i++) {
    if(params[i][0] == target) {
    value = params[i][1];
    break;
    }
    }



    switch (value) {
    case 'typeA':

    $(function(){
    $(\"#site0\").css({\"color\":\"red\",\"font-size\":\"24px\",\"font-weight\":\"bold\"});
    $(\".cs0\").insertAfter(\".cs3\");

    var obj = $('.moto0').clone();

    $('.h2c').after(obj);



    });
    break;

    case 'typeB':



    $(function(){
    $(\"#site1\").css({\"color\":\"red\",\"font-size\":\"24px\",\"font-weight\":\"bold\"});
    $(\".cs1\").insertAfter(\".cs3\");

    var obj = $('.moto1').clone();

    $('.h2c').after(obj);
    });

    break;


    </script>


    <div class=\"cs\"><span class=\"moto\">あいうえお</span></div>

    ";









    $text2 = "";



    $posting = $text1.$text2;


    require_once( dirname( __FILE__ ) . '/wp-load.php' );

    //実行時間の制限値を解除する
    set_time_limit(0);

    // ユーザーID
    $post_author = 1;

    // 記事データを用意
    $posts_data = array(
    // 1記事目
    array(
    'title' => 'たいとる', // 記事タイトル
    'content' => $posting, // 記事本文
    'post_name' => 'スラッグ名1', // スラッグ
    'category' => array(3), // カテゴリID(配列)
    'tags' => array('タグ1','タグ2'), // タグの名前(配列)
    'status' => 'publish', // 公開ステータス
    // postmetaのキーと値
    'postmeta' => array(
    array('key1', '値1'),
    array('key2', '値2')
    )
    )

    );



    // 記事データごとに展開
    foreach($posts_data as $key => $post){

    //投稿日時

    $date = date('Y-m-d H:i:s');
    // 記事データを作成
    $post_value = array(
    'post_author' => $post_author, // 投稿者のID
    'post_title' => $post[title],// 投稿のタイトル
    'post_name' => $post[slug], // スラッグ
    'post_content' => $post[content], // 投稿の本文
    'post_category' => $post[category], // カテゴリーID(配列)
    'tags_input' => $post[tags], // タグの名前(配列)
    'post_status' => $post[status], // 公開ステータス
    'post_type' => 'post', // 投稿タイプ
    'post_date' => $date // 投稿の作成日時
    );
    $insert_id = wp_insert_post($post_value);

    if($insert_id) {
    // postmetaデータごとに展開
    foreach($post[postmeta] as $key => $postmeta){
    // post_metaを作成
    update_post_meta($insert_id, $postmeta[0], $postmeta[1]);
    }// postmetaのループ終了

    // 記事データの作成に成功した場合の処理
    echo ($i + 1).'件目の記事データの作成に成功しました。 '.$post[title].' '.$date.'<br>';

    } else {
    // 記事データの作成に失敗した場合の処理
    echo ($i + 1).'件目の記事データの作成に失敗しました。 '.$post[title].' '.$date.'<br>';
    }

    $i++;

    } // 記事データのループ終了
    /////////////////////////////////////////////////////////////////////////////////////////////////








    おおよそこういった形で
    javascript jquery html文 wp_insert_postによる投稿 といった具合で続きます。
    ブラウザで投稿されたワードプレスの記事ページのソース、
    cronから実行された記事ページのソースを見ると
    仰られたエスケープ、に関連する辺りが関わっているというあたりで

    投稿されたページのソースは、


    ブラウザ実行からワードプレスに投稿されたものは、右クリックソースを見てみると、
    以下のようにそのままソース確認ができます。

    $(function(){
    $(\"#site1\").css({\"color\":\"red\",\"font-size\":\"24px\",\"font-weight\":\"bold\"});
    $(\".cs1\").insertAfter(\".cs3\");
    var obj = $('.moto1').clone();
    $('.h2c').after(obj);
    });





    cronで投稿された記事を右クリックソース確認すると↓このようにエスケープ、でしょうか;文字が処理されてしまっている具合です

    $(function(){
    $(&quot;#site1&quot;).css({&quot;color&quot;:&quot;red&quot;,&quot;font-size&quot;:&quot;24px&quot;,&quot;font-weight&quot;:&quot;bold&quot;});
    $(&quot;.cs1&quot;).insertAfter(&quot;.cs3&quot;);

    var obj = $(&#039;.moto1&#039;).clone();

    $(&#039;.h2c&#039;).after(obj);
    });



    そして加えて
    ↓↓こういったものはカットされてしまい、
    <script type='text/javascript'>
    </script>
    <script src='http://code.jquery.com/jquery-1.12.4.min.js&#039;></script>

    <style type='text/css'>
    </style>




    ↓↓こういったものは残ってしまう
    body {background:red;
    }
    という状態です。








    ただエスケープの辺りが上記の解決の糸口といえど、それをうまく受けるという処理もあるのかとは思えますが、
    ブラウザではエスケープ関連は問題にならず、cronでは問題になってしまうという・・
    お手数おかけしてしまいますが、なんとかご指導ご鞭撻頂けたら、と思います・。
    (cronでのエラー確認と cronの実行ユーザーでのログインしてからのコマンドラインからの実行の方は今から致します;)

    キャンセル

回答 1

0

「cronに登録すると」の定義がわかりません
具体的にどんな感じの登録なのでしょうか?

wgetなどクローラを介してhttp経由で処理していますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/18 14:12

    用語をしっかりと使えておらずに申し訳ありません;
    crontabに * * * * ~~~.php
    使用時刻、実行するファイル名などを記載して
    cronにファイルを実行させる、
    といった事について述べさせて頂きましたが、
    用語をしっかり把握できておらず、申し訳ありません・・;

    キャンセル

  • 2019/06/18 14:26

    > crontabに * * * * ~~~.php

    それはおそらくCLIモードといって違うロジックで動いています。
    wgetなど適当なクローラを用意して
    wget http://exsample.com/hogehoge.php

    のようなアクセスをしてあげてください

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • 自己作成PHPファイルからワードプレスへの記事投稿。ブラウザで実行すると出来るものがcronに登録してcronから実行すると出来ない。