it-swarm.com.de

Leeren Sie den Cache für Posts eines Typs, wenn etwas mit Posts eines anderen Typs passiert

BEARBEITEN: Basierend auf der Antwort von @ TimHallman habe ich eine Folgefrage, siehe unten in diesem Beitrag.

Ich versuche etwas zu tun, das weit über meinem Kopf liegt und je mehr ich darüber nachdenke, desto mehr Fragen werden mir gestellt.

Dies ist das Szenario, das ich habe:

  • Benutzerdefinierte Pfosten vom Typ golfcourse , die jeweils einen Golfplatz darstellen.
  • Benutzerdefinierte Beiträge vom Typ clubnews .
  • Clubnews hat den Begriff Clubnewsowner in Verbindung mit ihnen.
  • Die Clubnewsowner Taxonomien sind identisch mit den Golfplätzen.

Was ich tue, ist, dass ich (unter Verwendung eines selbst erstellten Shortcodes) bei jedem Golfplatzbeitrag überprüfe, ob ein oder mehrere Beiträge vom Typ Clubnews mit Taxonomie in Bezug auf den jeweiligen Golfplatz vorhanden sind. Wenn ja, zeige die Clubnews-Post (s) auf dem Golfplatz-Post.

Das funktioniert so, wie ich es will.

Ich verwende jedoch das WP-Rocket-Caching-Plugin auf dieser Website. Und da die Clubnews-Posts nur mit PHP (ohne Ajax) zu den Golfcourse-Posts hinzugefügt werden, hat WP-Rocket keine Ahnung, dass sich der Inhalt des Golfcourse-Posts geändert hat, wenn ein Clubnews-Post hinzugefügt, aktualisiert oder gelöscht wurde. Dies bedeutet, dass ich jedes Mal, wenn das erwähnte Szenario eintritt, eine manuelle Cache-Löschung des zugehörigen Golfplatzposts durchführen muss.

Zum Glück hat WP-Rocket eine Funktion dafür:

//clean post with ID 5
rocket_clean_post( 5 );

Ich habe es geschafft, eine Art Pseudocode zu erstellen:

function clearPageCacheBasedOnTaxOfClubnews() {
    if ( ( clubnews is created ) || ( clubnews is updated )  || ( clubnews is deleted ) ) {

        $customPost = clubnewsPostID;

        // The result here is always only one taxonomy
        $taxonomyOfCustompPost = get_post_taxonomies( $customPost );

        switch ($taxonomyOfCustompPost) {
            case 'golfcourseOne': rocket_clean_post( 5 );
            break;
            case 'golfcourseTwo': rocket_clean_post( 8 );
            break;
        }
    }
}
add_action( 'when?', 'clearPageCacheBasedOnTaxOfClubnews', 10, ?);

Ich denke, der obige Code wird funktionieren, aber es gibt eine Menge Dinge, bei denen ich mir nicht sicher bin:

  1. Wie erhalte ich die ID des Clubnews-Posts, der erstellt/aktualisiert/gelöscht wird?
  2. Wie überprüfe ich, ob es tatsächlich erstellt/aktualisiert/gelöscht wird?
  3. An diesem Punkt dreht sich mein Kopf und ich bin mir nicht mehr sicher, was ich mich frage ...

JEDE Hilfe wird geschätzt!


Zusatzfrage:

Ich glaube, @Tim Hallman löst mindestens zwei Drittel dieses Problems (ich benötige eine weitere Aktion, wenn ein benutzerdefinierter Beitrag von clubnews gelöscht wird) mit seiner unten stehenden Antwort.

Ich kann diese Arbeit jedoch nicht machen. Mein Code erzeugt einen weißen Bildschirm des Todes, ohne irgendwelche PHP-Fehler zu erzeugen. Was ich denke, passiert, dass WP Rocket alle Ressourcen auf dem Server verwendet, wenn der Cache für einzelne Posts geleert wird. Ich bin mir aber nicht sicher.

Dies ist der Code:

add_action( 'save_post', 'clearPageCacheBasedOnTaxOfClubnews');


function clearPageCacheBasedOnTaxOfClubnews($post_id) {

    /* Is has_term() used correctly here? In the codex it says that the
     * taxonomy parameter is optional, other places on the Internet claims
     * the opposite...
     */
    if ( has_term('clubnewsowner', '', $post_id ) {

        // The result here is always only one taxonomy
        $taxonomyOfCustompPost = get_post_taxonomies( $post_id );

        /* The codex says get_post_taxonomies() returns an array. The code
         * on the line below produces a php fatal error though.
         */
        $taxonomyOfCustompPost = $taxonomyOfCustompPost[0];

        /* This is where the connection between the taxonomy of the
         * Clubnews custom posts and the golf course pages happens
         */
        switch ($taxonomyOfCustompPost){
            case 'Course One': $courseID = 123; break;
            case 'Course Two': $courseID = 234; break;
            case 'Course Three': $courseID = 345; break;
            ...
        }

        //This cleans the cache of the selected post
        rocket_clean_post( $courseID );
    }
}

Ich habe dies in verschiedenen Varianten versucht und entweder erhalte ich einen schwerwiegenden Fehler aufgrund der $ taxonomyOfCustompPost = taxonomyOfCustompPost [0]; oder ich bekomme einen weißen Todesschirm ohne irgendwelche PHP-Fehler.

Irgendwelche Vorschläge, wie es weitergehen soll?

1
erolha

Ich nehme an, ein schneller und unsauberer Weg, um das zu erreichen, was Sie wollen, besteht darin, den gesamten Site-Cache zu leeren.

function clear_rocket_cache_on_post_save() {
     rocket_clean_domain();
}
add_action( 'save_post', 'clear_rocket_cache_on_post_save' );

Andernfalls müssen Sie eine Abfrage durchführen, um den passenden Beitrag zu erhalten. So sollte es funktionieren:

  function clear_rocket_cache_on_post_save( $post_id ) {

       // $result_id = tax query by $post_id
       rocket_clean_post( $result_id );

  }
  add_action( 'save_post', 'clear_rocket_cache_on_post_save' );

Weitere Informationen zu den Caching-Funktionen von Wordpress finden Sie hier: https://codex.wordpress.org/Transients_API

und hier: https://codex.wordpress.org/Class_Reference/WP_Object_Cache

Viele Themen verwenden diese Kernfunktionalität nicht, aber sie ist vorhanden.

AKTUALISIEREN:

Wenn Sie keine Debugging-Ausgabe auf Ihrem Bildschirm erhalten, können Sie am besten mithilfe der Datei debug.log herausfinden, warum Fehler auftreten.

Fügen Sie dieses Snippet zuerst am Ende Ihrer functions.php -Datei ein.

if (!function_exists('write_log')) {
    function write_log ( $log )  {
        if ( true === WP_DEBUG ) {
            if ( is_array( $log ) || is_object( $log ) ) {
                error_log( print_r( $log, true ) );
            } else {
                error_log( $log );
            }
        }
    }
}

Bearbeiten Sie dann Ihre wp-config.php-Datei, um diese einzuschließen:

define( 'WP_DEBUG', true);
define( 'WP_DEBUG_DISPLAY', false );
define( 'WP_DEBUG_LOG', true );

Erstellen Sie dann in Ihrem Ordner wp-content eine neue Datei mit dem Namen debug.log. Jetzt können Sie debuggen.

Was auch immer Sie ausgeben möchten, verwenden Sie die Funktion write_log($some_variable) und es werden Ihre Debug-Fehler an debug.log ausgegeben. Tun Sie das und ich wette, Sie werden sehen, warum Sie einen WSOD bekommen./happy Codierung

0
Tim Hallman

Ok, also habe ich das zum Laufen gebracht. Die Lösung basiert auf der Antwort von @TimHallman hier unten/oben.

Einer der Gründe, warum ich es nicht zum Laufen brachte, war, dass ich mit dem Begriff und der Taxonomie verwechselt wurde. Ich dachte, ein Begriff enthielt Taxonomien, wenn es das Gegenteil ist ....

Trotz der guten Ratschläge, solche Dinge nicht hart zu codieren, keine dynamischen Sites zu cachen und so weiter, gibt es Szenarien, in denen Code wie dieser benötigt wird. Und hier ist der Arbeitscode:

// Run the function when a post is created or updated
add_action( 'save_post', 'clearPageCacheBasedOnTaxOfClubnews');
function clearPageCacheBasedOnTaxOfClubnews($post_id) {

    $taxonomyOfCustompPost = get_post_taxonomies( $post_id );
    // In this special case, there is always only one taxonomy!
    $taxCustompPost = $taxonomyOfCustompPost[0];

    if ( $taxCustompPost != 'clubnewsowner' ) {
        return;
    }

    if ( $taxCustompPost == 'clubnewsowner' ) {
        $terms = wp_get_post_terms( $post_id, 'clubnewsowner', array("fields" => "names"));
        $term = $terms[0];;

        switch ($term){
            case 'Course One': $courseID = 123; break;
            case 'Course Two': $courseID = 456; break;
            case 'Course Three': $courseID = 789; break;
            ...
        }

        rocket_clean_post( $courseID );


    }
}

//Run the function when the post is deleted
add_action('trash_post','clearPageCacheWhenCPDeleted',1,1);
function clearPageCacheWhenCPDeleted($post_id){

    if(!did_action('trash_post')){

        $taxonomyOfCustompPost = get_post_taxonomies( $post_id );
        // In this special case, there is always only one taxonomy!
        $taxCustompPost = $taxonomyOfCustompPost[0];

        if ( $taxCustompPost != 'clubnewsowner' ) {
            return;
        }

        if ( $taxCustompPost == 'clubnewsowner' ) {

            $terms = wp_get_post_terms( $post_id, 'clubnewsowner', array("fields" => "names"));
            $term = $terms[0];;

            switch ($term){
                case 'Course One': $courseID = 123; break;
                case 'Course Two': $courseID = 456; break;
                case 'Course Three': $courseID = 789; break;
            }

            rocket_clean_post( $courseID );

        }
    }
}
0
erolha