自定义帖子类型分类的存档页面

时间:2015-07-21 作者:Blue Rose

我正在为自定义帖子类型的分类法的归档页面构建模板。

基本上我必须按照月份来显示

August 2015
July 2015
为了在上面显示,我使用了下面的过滤器:

add_filter( \'getarchives_where\',\'abc_where\',10,2);

add_filter(\'getarchives_join\', \'custom_archives_join\', 10, 2);

function custom_archives_join($x, $r) {
  global $wpdb;
  $cat_ID = $r[\'cat\'];
  if (isset($cat_ID)) {
    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)";
  } else {
    return $x;
  }
}
点击2015年8月,它应该会显示所有帖子,尤其是CPT的分类法。但目前我得到了所有的帖子。

有人能建议我使用这个归档页面来进行自定义帖子类型的分类吗?

1 个回复
SO网友:Pieter Goosen

在我开始之前,您的代码中有一个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切换到其他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版本,因为所有旧版本都已下线,因此不再受支持。虽然它们仍然可以工作,但无法获得安全更新,这可能会对网站的整体安全造成严重危害

    结束

    相关推荐

    自定义帖子类型分类的存档页面 - 小码农CODE - 行之有效找到问题解决它

    自定义帖子类型分类的存档页面

    时间:2015-07-21 作者:Blue Rose

    我正在为自定义帖子类型的分类法的归档页面构建模板。

    基本上我必须按照月份来显示

    August 2015
    July 2015
    
    为了在上面显示,我使用了下面的过滤器:

    add_filter( \'getarchives_where\',\'abc_where\',10,2);
    
    add_filter(\'getarchives_join\', \'custom_archives_join\', 10, 2);
    
    function custom_archives_join($x, $r) {
      global $wpdb;
      $cat_ID = $r[\'cat\'];
      if (isset($cat_ID)) {
        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)";
      } else {
        return $x;
      }
    }
    
    点击2015年8月,它应该会显示所有帖子,尤其是CPT的分类法。但目前我得到了所有的帖子。

    有人能建议我使用这个归档页面来进行自定义帖子类型的分类吗?

    1 个回复
    SO网友:Pieter Goosen

    在我开始之前,您的代码中有一个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切换到其他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版本,因为所有旧版本都已下线,因此不再受支持。虽然它们仍然可以工作,但无法获得安全更新,这可能会对网站的整体安全造成严重危害

    相关推荐