2016-08-03 15 views
1

Dies ist mehr eine Anfrage für eine Code-Überprüfung als ein Fehler. Die Frage ist, ob dies der "richtige Weg" zum Schreiben der folgenden Funktion ist.Wie kann man die Anzahl der Posts in WordPress ändern?

Was ich möchte ist eine php Cron-Task, die überprüfen würde, ob die Anzahl der Beiträge im Blog geändert hat, und wenn ja - zum Löschen der Homepage zwischengespeichert HTML.

Ich kann das WP Crontrol Plugin verwenden, um eine PHP Cron-Aufgabe einzurichten. Was ich brauche, sind die Funktionen, um eine globale Variable zu erstellen, die irgendwo in der Anzahl der Posts gespeichert wird (ich habe die wp_options-Tabelle verwendet), und jedes Mal, um den Server nach der aktuellen Anzahl der Posts zu fragen. Und wenn es einen Unterschied gibt, den Cache zu löschen. Unten ist die Funktion, die ich am Ende geschrieben habe. Ist es sinnvoll, oder gibt es etwas, was ich anders machen sollte (/ besser?)

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(); 

Antwort

1

Bewertung

Ihr Code ist ein guter Hack die löschen Cache, aber es ist schließlich ein Hack und ich werde es nicht in einer Produktionsumgebung verwenden.

Gründe dafür sind -

  1. Wie andere erwähnt, ist der Code nicht die Grenzfälle abdecken. Wenn Sie einen Beitrag veröffentlichen und die Veröffentlichung eines anderen Beitrags aufheben, bleibt die Anzahl gleich. Der Cron wird nicht laufen. In einer Website mit mehreren Autoren kann dieser Randfall zu häufig auftreten und Ihr Cron wird ein Treffer und Fehltreffer sein.
  2. Dies nutzt nicht die Funktionalität WordPress bietet Ihnen die Möglichkeit, mit Ereignissen wie post_publish umzugehen.
  3. Obwohl der Effekt einer hinzugefügten Datenbank jedes Mal, wenn Ihr Cron läuft, nicht zu groß ist, würde ich es lieber vermeiden.

Lösung

jetzt Ihre Frage zu beantworten, würde ich Aktion Haken verwenden. 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

Danke @Shivam, sehr interessant. Wenn ich fragen darf, wie haben Sie von "transition_post_status" erfahren? –

+1

Ich erinnerte mich, das in der Vergangenheit benutzt zu haben. API-Referenz - https://developer.wordpress.org/reference/hooks/transition_post_status/ –

+0

Super cool. Vielen Dank. –

2

zuerst Ihre Frage zu beantworten, würde ich die Zeichenfolge „Anzahl der veröffentlichten Beiträge“ extrahieren zu einer konstanten, so etwas wie OPTION_KEY Ich würde es auch prägnanter und Datenbank-y, und mit einem Präfix, um Kollisionen zu verhindern. etwas wie 'npdhc: number_posts'.


Um die Frage zu beantworten, die Sie nicht gefragt haben: Ich glaube nicht, Anzahl der Beiträge sind der beste Weg, eine Entscheidung über Zerschlagung den Cache zu machen. Theoretisch könnten Sie Randbedingungen erreichen, bei denen Sie einen Beitrag veröffentlichen und einen anderen löschen und der Cache nicht aktualisiert wird.

Es ist richtiger und auch einfacher zu codieren, verwenden nur die Änderungszeit des letzten Beitrag (ich glaube, es ist $post_modified_gmt aber nicht sicher)