web-dev-qa-db-ja.com

Cron経由で自動的に投稿タイプから投稿を削除する

最大50件の投稿を保持するなど、一定の制限に達すると、どのようにして特定の投稿タイプの投稿を削除することができますか。

その理由は、これらの投稿は定期的に自動的にインポートされているため、古い投稿が不要になることを除けば、DBが大きくなり過ぎないようにするためです。

3
urok93

私は投稿を切り捨てる動機を理解していませんが、この演習はあなたが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つの基本的なアプローチです。

アプローチ1:WP-Cronを使う

これが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

アプローチ2:UNIX cronを使う

あなたはネイティブのadmin-ajax.php機能を備えた真のUNIXクローンを使うことができます。

サーバーのcURLを確認してください

このアプローチはあなたのサーバーにインストールされるべきであるcURLを使います。そうでなくて、あなたがApache、Sudo apt-get install php5-curlそしてSudo /etc/init.d/Apache2 restartを使っているなら。

AJAXフックを作成します

サーバーが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;
}

あなたのCrontabを追加する

この設定は一日に一回実行されます。 -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()にあなたの特定のユースケースで猫の皮をむく多くの方法があります。私はあなたがここからそれを微調整できると確信しています。これがあなたを助けてくれることを願っています!

13
Brian Fegter

最も確実な方法は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/ にあります。

0