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错误的白色死亡屏幕。
你有什么建议吗?
最合适的回答,由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 );
}
}
}