在我开始之前,您的代码中有一个bug,如果启用了debug,您应该会发现这个bug。您是第一个分配$r[\'cat\']
在检查是否$r[\'cat\']
已设置。因为cat
不是默认值,可能未设置,这将在以下情况下导致PHP错误cat
未设置。您可以将代码重构为如下内容:(需要PHP5.3+。我还假设这是按预期工作的,所以我没有更改任何内容)
add_filter(\'getarchives_join\', function ( $x, $r )
{
global $wpdb;
// Set $cat_ID to the value of $r[\'cat\'] if it is set, otherwise set to false
$cat_ID = isset( $r[\'cat\'] ) ? $r[\'cat\'] : false;
// If $cat_ID is false, return $x as is
if ( !$cat_ID )
return $x;
// We have a value in $cat_ID, lets modify and return the required sql string
return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";
}, 10, 2 );
现在我们已经解决了这个问题,让我们看看真正的问题。为了在选择存档时在存档页面上获得正确的帖子,我们需要
知道请求的来源
根据帖子的来源过滤主查询,以显示正确的帖子。
为了解决要点1,我们需要一些推荐人,以便了解归档页请求的来源。这个推荐人将是我们的关键,这将使我们能够显示正确的职位根据条款。
HTTP引用程序非常不可靠,因为有许多客户端因素可以改变或控制引用程序的值。以下部分是我从之前的一个答案中提取的部分,作为推荐人的补充信息,因此您可以慢慢阅读以下内容
引用器的问题是,它们是由用户端设置和控制的。可以禁用或阻止引用者(就像用户通过代理访问站点一样)。出于兴趣,下面是一个非常有趣的问题的答案,在什么情况下http引用将是空的this post on
SO
当最终用户
在浏览器地址栏中输入网站URL
通过浏览器维护的书签访问了该网站作为窗口/选项卡中的第一页访问了该网站从https URL切换到http URL从https URL切换到其他https URL安装了安全软件(防病毒/防火墙等),该软件可从所有请求中删除推荐人
背后有一个代理,该代理从所有请求中删除推荐人以编程方式访问该站点(如curl),而无需设置referer标头(searchbots!)您还需要阅读其他答案以获得更多的见解
我也遇到了类似的问题,正在寻找一种更可靠的方法来设置和传递推荐人,这导致了(这个问题)(Get default permalink structure from pretty URL's) 还有一个很棒的answer by @gmazzap
正如我在评论中所暗示的,我们将在URL中传递一个值,我们将使用该值作为参考,根据归档页面中的术语显示正确的帖子。为了实现这一点,我们需要过滤get_archives_link()
函数将我们的推荐人添加到存档URL,并将我们的推荐人添加到query_vars
这样我们就可以阅读和使用它。
首先,添加query_vars
, 我们叫它ref
, 这是介绍人的缩写。ref
将保存一个与术语ID相等的自定义值
add_filter( \'query_vars\', function ( $vars )
{
$vars[] = \'ref\';
return $vars;
});
现在
ref
是可读的,让我们将其添加到
get_archives_link()
功能通过
get_archives_link
过滤器:(
由于短数组语法,这需要PHP 5.4以上版本([]
))
add_filter( \'get_archives_link\', function ( $link_html ) {
if( is_tax() ) { // Adjust this to target specific taxonomies or taxonomy terms if needed
preg_match ( "/href=\'(.+?)\'/", $link_html, $url );
$old_url = $url[1];
$new_url = add_query_arg( [\'ref\' => get_queried_object_id()], $old_url );
$link_html = str_replace( $old_url, $new_url, $link_html );
}
return $link_html;
});
您现在将看到,如果单击分类页面上的存档链接,您将看到以下内容添加到URL中,这将是我们的参考
?ref=1
其中一个是我们术语的ID
最后一部分(第二个要点)是相应地过滤我们的查询。这里我们需要
检查是否ref
已设置
如果ref
设置后,获取其值(不要忘记清理以避免数据注入)
相应地过滤主查询
代码的最后一部分是这样的:(由于短数组语法,至少需要PHP 5.4以上)
add_action( \'pre_get_posts\', function ( $q )
{
// VERY VERY IMPORTANT: Check if `ref` is set as $_GET variable, get the value and validate as an integer
$referrer = filter_var( INPUT_GET, \'ref\', FILTER_VALIDATE_INT );
if ( !is_admin() // Only target front end queries
&& $q->is_main_query() // Only target the main query
&& $q->is_date() // Only targets date archive pages, adjust as needed
&& $referrer // Only proceed if $referrer has a value
) {
// To avoid bugs in a multi custom taxonomy install, check if the term is valid
if ( term_exists( $referrer, \'CUSTOM_TAXONOMY_NAME\' ) ) { // IMPORTANT: Use the correct taxonomy name here
// Set our taxonomy term filter, again, set the correct taxonomy name
$tax_query = [
[
\'taxonomy\' => \'CUSTOM_TAXONOMY_NAME\',
\'terms\' => $referrer,
\'include_children\' => false,
]
];
$q->set( \'tax_query\', $tax_query );
$q->set( \'post_type\', [\'post\', \'YOUR_CUSTOM_POST_TYPE\'] ); // Adds custom post type to date archives
}
}
}, PHP_MAX_INT );
请注意:上面的大多数代码都未经测试,因此可能存在错误。此外,大多数代码都需要PHP5。4+,这个
should 是您安装的最低PHP版本,因为所有旧版本都已下线,因此不再受支持。虽然它们仍然可以工作,但无法获得安全更新,这可能会对网站的整体安全造成严重危害