web-dev-qa-db-ja.com

捕捉されないエラー:未定義の関数への呼び出しwp_generate_attachment_metadata()@ wp-cron

開発者

私はいくつかの写真をインポートして特定の投稿の添付ファイルとして設定することになっているWP-cronjobを実行しています。しかし、私はそれをWP-cronjobとして実行している間はそうすることができないようです - それは私が試しに "init"でそれを実行するときそれはちょうどうまく働きます。しかし、WP-cronjob内で実行しようとするとすぐに失敗します。

 register_activation_hook( __FILE__, 'OA_FeedManager_activated' );
 function importpicture_activated()
 {
    if (! wp_next_scheduled( 'import_feed' ) ) 
    {
       wp_schedule_event( time(), 'hourly', 'import' );
    }
 }

  add_action( 'import', 'call_import' );
  function call_import() 
  {
        //lots of code, where i get data from a XML feed, and creates a new post. no need to include it.           

        foreach($oDataXML->Media->Fotos->Foto as $key => $value)
        {
            $filename = wp_upload_dir()['path'].'/'.$oDataXML->SagsNr->__toString().'_'. $value->Checksum->__toString() . '.jpg';  
            $sPicture = $value->URL->__toString();
            copy($sPicture, $filename);
            $filetype = wp_check_filetype( basename( $filename ), null );

            $wp_upload_dir = wp_upload_dir();
            $attachment = array(
               'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ),
               'post_mime_type' => $filetype['type'],
               'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
               'post_content'   => '',
               'post_status'    => 'inherit'
            );
            $attach_id = wp_insert_attachment( $attachment, $filename, $iPost_ID );
            $attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
            wp_update_attachment_metadata( $attach_id, $attach_data );           
        }
  } 

私が読むことができたように、それはwp-cronjobをするときにwp_generate_attachment_metadata()関数が現在含まれていないからです、そして私はrequire_once('wp-load.php')をするべきです。

しかし悲しいことに、cronジョブを実行している間それを要求することはできません(私はwp-load.phpwp-includes/post.phpの両方を試しました) - しかし、トリックもしません。

だから私は私のWP-cronjobを正しく動作させるために私がどのように想定しているかを私に悟らせることができるWPSEの賢い人がいるかもしれません。

6
Mac

通常は管理者側の機能であるものの中には、「メイン」のワードプレスブートストラップの一部として含まれていないものもあります。アップロードされたファイル操作機能を含むファイルもその一つです。

include_once( ABSPATH . 'wp-admin/includes/image.php' );

あなたのcall_import関数に。

8
Mark Kaplun

Cronjobスクリプトの先頭(例:my-cron.php)で、次のようにします。

if ( ! defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

それからサーバにcronを設定してください。

5 * * * * wget -q -O - http://your-domain.com/my-cron.php

注: おそらくcronをPHP Command Line(CLI)として実行しようとしていましたが、うまくいきません。上記のように、cronをHTTPリクエストとして(wgetまたはcurlを付けて)実行する必要があります。

より詳しい情報は この公式のWordPress文書を読んでください

更新:

新しく追加されたCODEに基づいて、このCODEが間違っていることがわかります。

register_activation_hook( __FILE__, 'OA_FeedManager_activated' );
function importpicture_activated() {
    if ( ! wp_next_scheduled( 'import_feed' ) )  {
        wp_schedule_event( time(), 'hourly', 'import' );
    }
 }

 add_action( 'import', 'call_import' );
 function call_import() {
     // lots of code
 }

if ( ! wp_next_scheduled( 'import_feed' ) )をチェックしましたが、add_action( 'import', 'call_import' );をスケジュールしています。 cronが正しく機能するためには、同じアクションimportを登録する必要があります。また、アクティベーションフックはOA_FeedManager_activatedです。importpicture_activated関数を実行してください。そのため、コードは次のようになります。

register_activation_hook( __FILE__, 'OA_FeedManager_activated' );

function OA_FeedManager_activated() {
    importpicture_activated();
}

function importpicture_activated() {
    if ( ! wp_next_scheduled( 'import' ) ) {
        wp_schedule_event( time(), 'hourly', 'import' );
    }
 }

 add_action( 'import', 'call_import' );
 function call_import() {
     // lots of code
 }

Cronが正しく登録されているかどうかを確認するには、 controlプラグイン を使用します。また、 WP debugging をアクティブにして、CODEが生成しているエラーを確認してください。

注:未定義関数の場合wp_generate_attachment_metadata() error Markの answerを確認してください。

また、プラグインのアクティベーションフックでcronをスケジュールしたので、アクティベーションフック機能を変更した場合は、プラグインを非アクティブ化してから再度アクティブ化する必要があります。 Crontrolプラグインを使用して、不要なcronがバックエンドに登録されていないことを確認してください。

最後に、wp-config.phpdefine( 'DISABLE_WP_CRON', true );があるか確認してください。 WP cronを通常のWPロードで実行する場合は、削除するか(存在する場合)、falseに設定する必要があります。それ以外の場合は、OSのcrontabを使用してcronを設定する必要があります(私の答えの冒頭に示したように)。

2
Fayaz