開発者
私はいくつかの写真をインポートして特定の投稿の添付ファイルとして設定することになっている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.php
とwp-includes/post.php
の両方を試しました) - しかし、トリックもしません。
だから私は私のWP-cronjobを正しく動作させるために私がどのように想定しているかを私に悟らせることができるWPSEの賢い人がいるかもしれません。
通常は管理者側の機能であるものの中には、「メイン」のワードプレスブートストラップの一部として含まれていないものもあります。アップロードされたファイル操作機能を含むファイルもその一つです。
include_once( ABSPATH . 'wp-admin/includes/image.php' );
あなたのcall_import
関数に。
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.php
にdefine( 'DISABLE_WP_CRON', true );
があるか確認してください。 WP cronを通常のWPロードで実行する場合は、削除するか(存在する場合)、false
に設定する必要があります。それ以外の場合は、OSのcrontabを使用してcronを設定する必要があります(私の答えの冒頭に示したように)。