自定义分类存档页面问题

时间:2014-09-23 作者:AFT

我的网站是基于自定义帖子类型构建的,我用不同的自定义分类法组织了这些类型。菜单按钮是分类法归档页面(红色、蓝色、绿色),因此当您单击自定义分类法“socks”(例如)的术语“red”时,您将获得与红色socks对应的所有文章。现在,问题是我只有一个页面(称为taxonomy socks.php)处理自定义分类术语归档页面,我想设置一个红色袜子、蓝色袜子、绿色袜子的小表示,并带有图片和css样式。。。在每个归档页上,但我不知道如何实现这一点!我想最好的选择是在一篇文章中进行描述,然后在每个自定义分类术语归档页面上显示每篇文章。。。但是怎么做呢?这是我的页面分类袜子的代码。php:

<div class="main-content">
 <?php $term = get_term_by( \'slug\', get_query_var( \'term\' ), get_query_var( \'taxonomy\' ) ); ?>
  <div id="container">
    <div id="content" role="main">
     <h1><?php echo $term->name; ?></h1>
      <?php 
      if (have_posts()) : ?>
        <?php while (have_posts()) : the_post();  
      $i++;?>
         <div class="portfolio<?php if ( ($i%3) == 0 ) { echo \' last\'; } elseif ( ($i%2) == 0 ) { echo \' two-last\'; } elseif ( ($i%4) == 0 ) { echo \' very-large\'; } ?>" data-thematique="<?php echo implode(\', \', get_field(\'thematique\')); ?>" data-activite="<?php echo implode(\', \', get_field(\'activite\')); ?>" data-niveau="<?php echo implode(\', \', get_field(\'niveau\')); ?>">
                                <div class="project-image"><?php the_post_thumbnail(); ?></div>
                                <div class="project-info">
                                <span class="portfolio-title"><?php the_title(); ?></span>
                                    <span class="portfolio-act"><span class="light">NIVEAU :</span> <span class="white"><?php the_field(\'niveau\'); ?></span></span>
                                    <span class="portfolio-act"><span class="light">THÉMATIQUE :</span> <span class="white"><?php the_field(\'thematique\'); ?></span></span>
                                    <span class="portfolio-act"><span class="light">ACTIVITÉ :</span> <span class="white"><?php the_field(\'activite\'); ?></span></span>
                                      <span class="portfolio-act"><span class="light">Lieu : </span><span class="white"><?php echo the_field(\'lieu1\'); ?></span></span></div><a href="<?php echo get_permalink(); ?>" class="button portfolio-button">EN SAVOIR PLUS</a>
                            </div>

      <?php
      endwhile; ?>
      <?php endif; ?></div> 

      </div></div>
谢谢你的帮助。。。我希望这足够清楚。。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

这里有很多选择,你想实现什么以及如何实现都取决于你自己。

我的想法是使用可用的模板来避免if else 条件语句。这个Template Hiearchy 提供条款模板,taxonomy-{$taxonomy}-{$term}.php, 所以你可以为每个学期创建一个tempate。对于红色,您可以创建taxonomy-socks-red.php.

我知道这将是非常压倒性的,但我认为任何其他方法也是如此

EDIT 1

这里还有一些你可以尝试的东西我现在没有时间来测试这个,因为我们正在庆祝“国家篮球队”:-)

首先,注册一个新的帖子类型,称之为“描述”。您可以保留默认值,以便post type 不可公开查询。请参阅附加的链接,链接到您可以使用的所有参数和参数

function codex_custom_init() {
    $args = array(
      \'label\'  => \'Descriptions\'
    );
    register_post_type( \'descriptions\', $args );
}
add_action( \'init\', \'codex_custom_init\' );
你现在可以写帖子了,帖子将显示在你的taxonomy-socks.php. 从特定术语的标题开始。如果您的帖子针对的是术语red, 把你的标题写得像“红色-穿上漂亮的彩色袜子去参加拉姆斯坦音乐会”

使用以下代码this answer 通过@G.M.,您可以按标题名称搜索自定义帖子,如果帖子与您的术语名称匹配,则返回帖子。这将进入您的功能。php

// require PHP 5.3+
add_action( \'posts_where\', function( $where, $query ) {
  if ( isset( $query->query[\'name__in\'] ) && is_array( $query->query[\'name__in\'] ) ) { 
    global $wpdb;
    $names = array_filter( array_map( function( $name ) use( $wpdb ) {
        $sane = sanitize_title( $name );
        return ! empty( $sane ) ? $wpdb->prepare( \'%s\', $sane ) : NULL;
   }, $query->query[\'name__in\'] ) );
    if ( ! empty( $names ) ) {
      $where .= " AND {$wpdb->posts}.post_name IN (" . implode( \',\', $names ) . ")";
    }
  }
  return $where;
}, PHP_INT_MAX, 2 );
  • 您已经获得了当前术语名称,因此这里不需要额外的代码。你会回来的$term->name 到新的name__in 新中的参数WP_Query. 此查询将位于主循环的正上方

    $args = array(
      \'post_type\'       => \'descriptions\',
      \'posts_per_page\'  => 1,
      \'name__in\'        => $term->name
    );
    $the_query = new WP_Query( $args );
    
    // The Loop
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
               //Show what you need to show
        }
    
    } 
    /* Restore original Post Data */
    wp_reset_postdata();
    
  • EDIT 2

    好的,我已经测试了所有内容,看来@G.M.的代码不适合这份工作。然而,我已经用我不久前从@birgire在他的一篇文章中找到的以下代码进行了测试answers here. 这更适合这份工作

    因此,您需要进行相应的更改,下面是如何

    您仍将注册自定义帖子类型descriptions (注意,它不能description) 你还是要写你的特别帖子EDIT 1 标题如所述

    将要改变的是我们如何查询帖子。首先,我们要创建一个新的name__like 参数并扩展WP_Query 班这是代码。您还可以链接到@birgire的答案这将进入您的功能。php

    class WPSE_Query extends WP_Query // thanks @birgire https://wordpress.stackexchange.com/a/136758/31545
    {       
        public function __construct( $args = array() )
        {
            add_filter( \'posts_where\', array( $this, \'posts_where\' ), 10, 2 );
            parent::__construct( $args );
        }
        public function posts_where( $where, $qry )
        {       
            remove_filter( current_filter(), array( $this, __FUNCTION__ ) );    
            $name__like = $qry->get( \'name__like\' ); 
            if( ! empty( $name__like )  )
            {
                $where .= " AND ";
                $where .= $GLOBALS[\'wpdb\']->posts;
                $where .= ".post_name LIKE \'";
                $where .= esc_sql( like_escape( $name__like ) );
                $where .= "%\' ";            
            }   
            return $where;
        }
    }
    
    现在我们可以查询帖子了,但我们不打算使用原始帖子WP_Query 方法,但它的新扩展类,WPSE_Query. 因此,新的自定义查询如下所示

    $args = array(
      \'post_type\'       => \'descriptions\',
      \'posts_per_page\'  => 1,
      \'name__like\'        => $term->name
    );
    $the_query = new WPSE_Query( $args );
    
    // The Loop
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
               //REMEMBER TO CHANGE THIS WITH YOUR LOOP ELEMENTS LIKE 
               the_title();
        }
    
    } 
    /* Restore original Post Data */
    wp_reset_postdata();
    
    希望这正是您想要的

    结束

    相关推荐

    Why aren't my posts showing?

    我正在为我的投资组合网站创建一个主题。经过一段时间的反复试验和研究,我陷入了困境。这将是一个内容非常少的网站,因此我决定创建一个单页网站。我正在使用get_pages($args); 在我的首页中显示每页。php文件。这很有效。现在我陷入了困境。。。我想使用一个页面来显示我的博客帖子,它将包含在我的一个页面流中,并与其他页面一样在我的WP\\U查询中调用。到目前为止,我已经尝试了我能找到的记录最多的方法;这将更改用于在“设置”>“阅读”中显示帖子的页面。为了确认我有一个静态主页(FrontPage.