最大50件の投稿を保持するなど、一定の制限に達すると、どのようにして特定の投稿タイプの投稿を削除することができますか。
その理由は、これらの投稿は定期的に自動的にインポートされているため、古い投稿が不要になることを除けば、DBが大きくなり過ぎないようにするためです。
私は投稿を切り捨てる動機を理解していませんが、この演習はあなたがcron + WordPressの使い方を理解するのに役立つと思います。
これは、WP-cronまたはUNIX cron以下の両方の方法に使用できます。
function foobar_truncate_posts(){
global $wpdb;
# Set your threshold of max posts and post_type name
$threshold = 50;
$post_type = 'foobar';
# Query post type
$query = "
SELECT ID FROM $wpdb->posts
WHERE post_type = '$post_type'
AND post_status = 'publish'
ORDER BY post_modified DESC
";
$results = $wpdb->get_results($query);
# Check if there are any results
if(count($results)){
foreach($result as $post){
$i++;
# Skip any posts within our threshold
if($i <= $threshold)
continue;
# Let the WordPress API do the heavy lifting for cleaning up entire post trails
$purge = wp_delete_post($post->ID);
}
}
}
これがWordPressでイベントをスケジュールするための2つの基本的なアプローチです。
これがWPのやり方なので、最初にこのアプローチを見ていきます。注意してください、WP Cronは本当のcronではありません、そしてそれはしばしば擬似cronと呼ばれます。サイトに対するトラフィックが少ない場合は、サーバーへの要求に基づいているため、一貫性がありません。リクエストが届かない場合は、予定されているイベントが遅くなります。
if(!wp_next_scheduled( 'foobar_truncate_posts_schedule')){
wp_schedule_event(time(), 'daily', 'foobar_truncate_posts_schedule');
}
add_action('foobar_truncate_posts_schedule', 'foobar_truncate_posts');
あなたがWP-Cronにあなたのスケジュールが欠けていること、スケジュールされた投稿を公開することなどを見つけたら、あなたはUNIX cronでそれをさらに自動化することができます。これは 素晴らしい記事です は指定された間隔でwp-cron.phpにpingを実行する方法を紹介します。 UNIXのcronを使ってwp-cronをオンタイムに保つために彼らが推奨するものは次のとおりです。
wget http://www.server.com/wp-cron.php > /dev/null 2>&1
あなたはネイティブのadmin-ajax.php機能を備えた真のUNIXクローンを使うことができます。
このアプローチはあなたのサーバーにインストールされるべきであるcURLを使います。そうでなくて、あなたがApache、Sudo apt-get install php5-curl
そしてSudo /etc/init.d/Apache2 restart
を使っているなら。
サーバーがWPで認証されていないため、必ずnoprivに設定してください。
add_action('wp_ajax_nopriv_truncate_posts', 'foobar_truncate_posts_cron');
function foobar_truncate_posts_cron(){
# We use the user-agent as a shared key
$shared_user_agent = 'FooBar TruncatePostsCron/1.0';
# Block unwanted IP addresses
$whitelisted_ips = array( //IPs allowed to run this operation
'192.168.1.1',
'127.0.0.1'
);
# Retrive Request Information
$request_user_agent = $_SERVER['HTTP_USER_AGENT'];
$request_ip = $_SERVER['REMOTE_ADDR'];
# Authenticate
if($request_user_agent === $shared_user_agent && in_array($request_ip, $whitelisted_ips))
echo foobar_truncate_posts(); // Reusable function
else
echo 'Authentication failed for post trucation cron.';
exit;
}
この設定は一日に一回実行されます。 -A
は共有ユーザーエージェントのシークレットを設定します-o
は出力ファイルを指定します、action=truncate_posts
はあなたのajaxフックアクションに関連しています。 /user/bin/curl
がcURLコマンドを実行するための適切なパスであることを確認してください。代わりにcurl
を使うことができるかもしれません。
0 0 * * * /usr/bin/curl -A 'FooBar TruncatePostsCron/1.0' -o ~/truncate_posts.log http://yourdomain.com/wp-admin/admin-ajax.php?action=truncate_posts
そして最後に、php.iniにregister_globals=off
を設定して、なりすましを防ぐようにしてください。
これらはWordPress + cronへの2つの主要なアプローチです(本当かどうかにかかわらず)。 foobar_truncate_posts()
にあなたの特定のユースケースで猫の皮をむく多くの方法があります。私はあなたがここからそれを微調整できると確信しています。これがあなたを助けてくれることを願っています!
最も確実な方法はWP-Cron自体を使うことです。しかし、あなたが非常に軽い要求を持っているならば、あなたはそれをそのままにしておくことができ、wp-cronを何度も動かす複数の訪問やイベントの重複のような問題は決して起こりません。
を参照する必要があります最初のインスタンスに時間がかかりすぎる場合はwp-cron.phpを2回実行しても安全ですか?
そこには(実際にはより多くの投票に値する答えが)明らかに述べられている。なぜなら、wp-cronは仕事を再スケジュールしスケジュールを解除するからである。これは仕事を実行する直前にスケジュールを解除する。 "2回実行してください"、はい、重いだらけのブログが同じイベントを2回キックするかもしれないところで起こるかもしれない競合状態があるかもしれないという心配があります。
今ワードプレスチームは同じのための解決策を持っています、そしてそれはwp-config.phpのクーロンを無効にすることです。これはcronを無効にしませんが、実際には訪問が発生したときにcronの起動を無効にします。この後、Webクーロンはwgetまたはcurlを使用して設定できますが、サービスが30秒以内に終了することが確信できない場合は、phpスクリプトのデフォルトのタイムアウトになります。 PHPのcli。これを行う方法についてのより詳細なドキュメントは https://rtcamp.com/tutorials/wordpress/wp-cron-crontab/ にあります。