2016-08-03 18 views
1

これは、バグよりもコードレビューの要求です。問題は、これが以下の関数を書く「正しい方法」なのかどうかです。WordPressの投稿数の変更を検出するにはどうすればよいですか?

ブログの投稿数が変更されているかどうかを確認するPHP cronタスクを実行し、そうであれば - キャッシュされたホームページを消去します。

WP Crontrolプラグインを使用してphp cronタスクを設定できます。私が必要とするのは、(wp_optionsテーブルを使用して)ポストの数のどこかに格納されるグローバル変数を作成する関数であり、毎回、現在のポスト数をサーバに問い合わせる関数です。そして、それは違いがある場合は、キャッシュをクリアする。以下は、私が書いた関数です。あなたの質問に答えることの意味を作るか、私は違っやるべきものがある(/より良いが?)

if_new_posts_delete_homepage_cache = function() { 
    // get current number of posts 
    // https://codex.wordpress.org/Function_Reference/wp_count_posts 
    $count_posts = wp_count_posts(); 
    $new_number_of_posts = $count_posts->publish; 

    // https://developer.wordpress.org/reference/functions/get_option/ 
    // set number of posts for the first time 
    // some code that adds the current 
    $old_number_of_posts = get_option("number of published posts", 0); 

    // if the option is not set - update it 
    // https://codex.wordpress.org/Function_Reference/add_option 
    if($old_number_of_posts == 0) { 
     add_option("number of published posts", $new_number_of_posts); 
     $old_number_of_posts = $new_number_of_posts; 
    } 

    if($old_number_of_posts < $new_number_of_posts) { 
    unlink(dirname(__FILE__) . "/wp-content/cache/supercache/sitename.com/" . 'index.html.gz'); 
    } 
} 

if_new_posts_delete_homepage_cache(); 

答えて

1

レビュー

あなたのコードは、クリアするには良いハックです結局のところ、これはハックであり、実稼働環境では使用しません。そのため

理由がある -

  1. 他の人が指摘したように、あなたのコードは、エッジケースをカバーしていません。投稿を公開して別の投稿を公開しない場合、カウントは同じままです。クーロンは走りません。複数の著者のウェブサイトでは、このエッジケースが頻繁に発生する可能性があり、cronはヒットとミスになります。
  2. これは、WordPressがpost_publishのようなイベントを処理するために提供する機能を活用していません。
  3. cronの実行がそれほど大きくない可能性があるたびに、追加されたデータベースのヒット率が向上しますが、回避することをお勧めします。

ソリューションは、今すぐあなたの質問に答えるために、私はアクションフックを使用します。 https://developer.wordpress.org/reference/functions/add_action/

function clearCacheOnStateChange($new_status, $old_status, $post) { 
    if ($new_status != $old_status) { 
     unlink(dirname(__FILE__) . "/wp-content/cache/supercache/sitename.com/" . 'index.html.gz');  
    } 
} 
add_action( 'transition_post_status', 'clearCacheOnStateChange', 10, 3); 
+0

ありがとう@シヴァム、非常に面白いです。もし私が尋ねることができるなら、あなたはどのように "transition_post_status"について知りましたか? –

+1

私は過去にこれを使って覚えていました。 APIリファレンス - https://developer.wordpress.org/reference/hooks/transition_post_status/ –

+0

超クールです。ありがとう。 –

2

はまずありません、私は、定数にようなものを文字列「に公開投稿数」を抽出したいですOPTION_KEY。 私はまた、衝突を防ぐために、より簡潔にdatabase-yと接頭辞を付けることにします。 'npdhc:number_posts'のようなものです。


あなたは質問しなかった質問に答えてください:私は投稿数がキャッシュを破棄することを決定する最良の方法だとは思わない。 理論的には、1つの投稿を公開して別の投稿を削除すると、キャッシュが更新されないエッジ条件になる可能性があります。

それはちょうど最後のポストの修正時刻を使用するために、より正確かつまたコードに簡単です(私はそれが$post_modified_gmtではなく、確かだと思う)

関連する問題