当一种类型的POST发生问题时清除另一种类型的POST的缓存

时间:2018-03-08 作者:erolha

EDIT: <根据@TimHallman的回答,我有一个后续问题,请看这篇文章的底部

我正试图做一些超出我头脑的事情,我想得越多,我最终会遇到越多的问题。

这就是我的情况:

类型的自定义帖子golfcourse, 每个人都有一个高尔夫球场clubnews.clubnewsowner 与他们相关我所做的是(使用自制的短代码)在每个高尔夫球场帖子上检查是否存在一个或多个clubnews类型的帖子,其分类与特定高尔夫球场相关。如果是,请在高尔夫球场帖子上显示俱乐部新闻帖子。

这是我想要的。

然而,我确实在这个网站上使用了WP Rocket缓存插件。而且,由于clubnews帖子(到golfcourse帖子)仅使用php(无ajax)添加,所以每当添加、更新或删除clubnews帖子时,WP Rocket都不知道golfcourse帖子上的内容发生了变化。这意味着每当出现上述场景时,我需要手动清除相关的golfcourse帖子。

幸运的是,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, ?);
我认为上面的代码可以工作,但这里有很多事情我不确定:

如何获取正在创建/更新/删除的clubnews帖子的ID

<小时>

Follow-up question:

我相信@TimHallman用下面的答案至少解决了三分之二的问题(当clubnews自定义帖子被删除时,我需要另一个动作)。

一、 然而,我们无法做到这一点。我的代码生成一个白色的死亡屏幕,不会生成任何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 );
    }
}
我曾在不同的变体中尝试过这一点,但要么因为$taxonomyofcustompost=taxonomyofcustompost[0]而出现致命错误;或者我会得到一个完全没有php错误的白色死亡屏幕。

你有什么建议吗?

3 个回复
最合适的回答,由SO网友:Tim Hallman 整理而成

我认为,要实现您想要的目标,一种快速而肮脏的方法是清除整个站点缓存,如下所示:

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

许多主题没有利用这个核心功能,但它确实存在。

更新时间:

如果您没有在屏幕上获得调试输出,那么找出错误原因的最佳方法是使用调试。日志

首先,将此片段放在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/快乐编码

SO网友:erolha

好的,我把它做好了。解决方案基于以下/以上的@TimHallman的答案。

我没有让它发挥作用的原因之一是我对什么是术语和什么是分类法感到困惑。我认为一个术语包含了分类学,而它恰恰相反。。。。

尽管有很好的建议,不要硬编码这样的东西,不要缓存动态网站等等,但在某些情况下,需要这样的代码。以下是工作代码:

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

        }
    }
}

SO网友:Mark Kaplun

基本上,一旦开始使用页面缓存,就无法进行动态操作。这就是为什么wordpress没有现成的页面缓存的部分原因。

清理页面缓存,尤其是当它不在wordpress运行的服务器上时,可能是一个很长的过程,这将使您的服务器更加繁忙(拥有页面缓存的全部目的是减少负载)。

根据您的描述,您面临的问题不是真正的问题,因为没有人会因为拥有一些陈旧的海湾航线信息而死亡,但如果您必须拥有这些信息,更简单的方法是缩短缓存过期之前的时间。这将更容易做到,并且您不需要编写可能有bug并且需要持续维护的代码。

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register