web-dev-qa-db-ja.com

何かが他のタイプの投稿に発生したときに、あるタイプの投稿のキャッシュをクリアする

編集: @ TimHallmanの回答に基づいてフォローアップの質問があります。この記事の下のほうをご覧ください。

私は頭の上にあるやり方で何かをやろうとしています、そして私がそれについて考えるほど、私はより多くの質問をすることになります。

これは私が持っているシナリオです:

  • タイプ golfcourse のカスタム投稿、それぞれゴルフコースを表します。
  • タイプ clubnews のカスタム投稿。
  • Clubnewsには、 clubnewsowner という用語が関連付けられています。
  • clubnewsownerの分類は、ゴルフ場と同じです。

私がしているのは、(自分で作ったショートコードを使って)それぞれのゴルフコース投稿で、特定のゴルフコースに関連した分類法を持つクラブニュースの投稿があるかどうかをチェックするということです。そうであれば、clubcres-post(s)をgolfcourse-postに表示してください。

これは私が望むように機能します。

ただし、このWebサイトではWP-Rocketキャッシングプラグインを使用しています。また、clubnews投稿はphpのみ(ajaxなし)を使用して(golfcourse-postsに)追加されるので、WP-Rocketはclubnews投稿が追加、更新または削除されたときはいつでもゴルフコース投稿上でコンテンツが変更された手がかりがありません。これは、言及したシナリオが発生したときはいつでも、関連するゴルフ場のポストを手動でキャッシュクリアす​​る必要があることを意味します。

幸いなことに、WP-Rocketにはこの機能があります。

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

なんらかの疑似コードを作成できました。

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, ?);

私は上記のコードはうまくいくと思いますが、ここではよくわからないことがたくさんあります。

  1. 作成、更新、削除されたclubnewsの投稿のIDを取得するにはどうすればいいですか?
  2. 実際に作成/更新/削除されているかどうかを確認するにはどうすればよいですか?
  3. この時点で私の頭は回転し始めます、そして私はもはや私が疑問に思っているものがわからない...

任意の助けは大歓迎です!


フォローアップの質問:

私は@Tim Hallmanが少なくともこの3分の2を解決したと考えています(カスタムの投稿が削除された場合は別のアクションが必要です)。

しかし、私はこの仕事をすることができません。私のコードでは死の白い画面が表示されますが、phpエラーは発生しません。私が思うのは、WP Rocketが個々の投稿のキャッシュをクリアするときにサーバー上のすべてのリソースを使うということです。よくわかりません。

これはコードです:

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

これをさまざまな方法で試したところ、$ taxonomyOfCustompPost = taxonomyOfCustompPost [0]のために致命的なエラーが発生しました。または、phpエラーがまったく発生していないのに、白い画面が表示されます。

ここから先に進む場所について何か提案はありますか?

1
erolha

私はあなたが望むものを達成するための迅速で汚い方法はサイトキャッシュ全体をクリアすることであると思います。

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

それ以外の場合は、一致する投稿を取得するためにクエリを実行する必要があります。

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

Wordpressの「すぐに使える」キャッシュ機能の詳細については、こちらを参照してください。 https://codex.wordpress.org/Transients_API

そしてここ: https://codex.wordpress.org/Class_Reference/WP_Object_Cache

多くのテーマはこのコア機能を利用していませんが、それはあります。

更新:

画面にデバッグ出力が表示されない場合は、debug.logを使用して、エラーが発生した理由を突き止めるのが最善の方法です。

まず、このスニペットをfunctions.phpファイルの末尾に配置します。

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

次に、wp-config.phpファイルを編集してこれらを含めます。

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

次に、wp-contentフォルダーにdebug.logという名前の新しいファイルを作成します。これでデバッグの準備が整いました。

あなたが出力したいものは何でもあなたはwrite_log($some_variable)関数を使います、そしてそれはあなたのデバッグエラーをdebug.logに出力します。それをしてください、そして、私はあなたがなぜあなたがWSODを得ているのかわかるでしょう。 /ハッピーコーディング

0
Tim Hallman

わかりました、それで私はこれを働かせました。解決策は@TimHallmanの回答に基づいています。

うまくいかなかった理由の1つは、用語と分類法とが混同されていたことです。それが反対であるとき、私は用語 含まれた 分類学を考えました…。

このようなものをハードコーディングしない、動的なサイトをキャッシュしないなどの良いアドバイスにもかかわらず、このようなコードが必要とされるシナリオがあります。そして、これが作業コードです。

// 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