如何为分类“根”创建主题模板

时间:2018-08-26 作者:Diana

我刚刚为一个使用了很多分类法的项目提出了这个问题,我需要列出使用分类法本身的帖子,而不仅仅是术语。

我有一个名为“颜色”的分类法,因此术语可以是“红色”、“蓝色”等,我们可以看到所有使用术语访问的帖子:

site.com/colors/red
site.com/colors/blue
I want to be able to access "site.com/colors" and there list everything using any term from "Colors" taxonomy 也就是说,我想列出使用taxo而不仅仅是术语的帖子。

对于一个小项目,我创建了page template 对于一个带有自定义查询的静态页面,我有大约8种分类法,但在当前的项目中,为每个分类群创建静态页面来做同样的事情似乎有点蹩脚。

2 个回复
最合适的回答,由SO网友:Tedinoz 整理而成

这里有一个基于单一分类法的替代方法。php文件。

总之,在分类法开始时调用函数。php。该函数计算分类法url并确定应用哪个自定义分类法(如果有)。然后它就会ALL the terms 对于该分类法(不仅仅是url中的分类法),然后获取ALL the posts 这些术语引用。此时,您可以添加代码以按照自己的意愿格式化自定义分类法帖子,或者(如果没有自定义分类法帖子)允许分类法。php照常接管并格式化帖子。在我的(测试过的)示例中,函数进入函数。php,但如果您愿意,可以将其放入插件中。

我创建了两个自定义分类(“颜色”和“位置”)。为了测试的销售,我已经将论文硬编码到函数中的一个数组中,但这种方法有很多替代方法。我的意图是表明这可以通过编程实现,而无需创建众所周知的“101分类文件”。

我创建了分类法。通过创建一个空白文件,将其保存为“分类法”。然后复制归档文件的内容。php。在我的测试中,我只打印了术语帖子的标题(以证明帖子信息已被检索),但您可以随意更改。

在屏幕快照中,您可以看到url为“location/sydney”。标准分类页面在屏幕底部显示两个“Sydney”帖子,但该功能包括一个额外帖子(显示在页面顶部),用于location=“Melbourne”。

我的自定义分类法数组(我的变量名为$myarrayoptions)只有两个自定义分类法(slug是“color”和“location”),但这可以是任意的。我做了一个假设:每个帖子只有一个自定义分类法。同样,每个帖子都有处理多个分类法的方法,但这足以用于演示目的。

这是我在函数中的函数。php。我在所有的“echo”语句中都留下了用于调试的内容,您可以在空闲时删除这些内容。

/*
 * Create function to set if custom taxonomy is set
*/
function checktax(){
    global $wp;
    //echo "<p>TESTING - START</p>";

    // create a simple array showing the name of all the referenced custom taxonomies
    $myarrayoptions = array(\'color\',\'location\');
    //echo "the custom taxonomies are <pre>";print_r($myarrayoptions);echo "</pre>";  //DEBUG

    // get the url
    $myurl = home_url( $wp->request );
    //echo "<p>The url is ".$myurl." </p>";  //DEBUG

    // Explode the url to get access to the taxonomy and terms
    $pageterms = explode(\'/\', $myurl);
    //echo "the exploded components of the URL <pre>";print_r($pageterms);echo "</pre>"; //DEBUG

    // check whether any custom taxonomies are included in the page url and then do stuff
    if (array_intersect($pageterms,$myarrayoptions)) {

        // find which custom taxonomy is in the url - there should only be ONE!
        $result = array_intersect($pageterms,$myarrayoptions);
        //echo "the custom taxonomy is <pre>";print_r($result);echo "</pre>"; //DEBUG

        // get the value of the custom taxonomy. this is very clumsy but it does work.
        foreach ($result as $key => $value){
        //echo "<p>the array key is ".$key." and the taxonomy is ".$value."</p>";  //DEBUG
        }
        // echo "<p>the taxonomy is ".$value."</p>"; //DEBUG

        // the term in the URL is the field after the taxonomy so we just add 1 to the key to get the term
        $urlterm = $pageterms[($key+1)];
        //echo "<p>the term in the url is ".$urlterm."</p>"; //DEBUG

        // get all the terms for this custom taxonomy
        $myterms = get_terms( array(
                \'taxonomy\' => $value,
                \'hide_empty\' => false,
        ) );    
        //echo "the terms are <pre>";print_r($myterms);echo "</pre>"; //DEBUG

        //create a simple array to store the terms for use in a query
        $termsarray = []; 
        // get the slugs only
        $termsarray = wp_list_pluck( $myterms, \'slug\' );
        //echo "terms array is <pre>";print_r($termsarray);echo "</pre>"; //DEBUG

        // build a new query to get all the posts for the custom taxonomy
        // this is sortable but the OP didn\'t mention that
        $myargs = array(
                \'post_type\' => \'post\',
                \'posts_per_page\' => -1,
                \'tax_query\' => array(
                        array(
                                \'taxonomy\' => $value,
                                \'field\' => \'slug\',
                                \'terms\' => $termsarray,
                        )
                )
        );  
        $newquery = new WP_Query( $myargs );    
        //echo "newquery is <pre>";print_r($newquery);echo "</pre>";  //DEBUG

        // now we have all the posts for the custom taxonomy
        // so we can print whatever we like

        // Page Header
        echo \'<h1 class="page-title">\'.$value.\'</h1>\';

        while ( $newquery->have_posts() ) {
            $newquery->the_post();
            the_title( \'<h1 class="entry-title">\', \'</h1>\' );

        }

    }

        //echo "<br/>TESTING - END<br/>";  //DEBUG  
}
这是分类法的摘录。php。“checktax”函数完成此工作。

get_header(); ?>

<div class="wrap">

    <?php if ( have_posts() ) : ?>
        <header class="page-header"><!-- taxonomy -->
            <?php
                checktax();     

                the_archive_title( \'<h1 class="page-title">\', \'</h1>\' );
                the_archive_description( \'<div class="taxonomy-description">\', \'</div>\' );
            ?>
        </header><!-- .page-header -->
    <?php endif; ?>
最后,这是一个屏幕快照。enter image description here

SO网友:benny-ben

我找到了这个解决方案:

创建一些页面时使用与分类法相同的slug,例如颜色

为创建的页面提供相同的模板,例如模板分类法。php

在模板中,通过以下方式制定自定义WP\\U查询:

    // Get slug of the page = slug taxonomy
    $taxonomy = get_post_field( \'post_name\', get_post() );

    // If the name of the taxonomy is composed of several words with the underscore,
    // replace the possible dash:
    /*
    $tricktax = substr_count( $taxonomy, \'-\' );

    if ( $tricktax !== 0 ) {
      $taxonomy = str_replace( \'-\', \'_\', $taxonomy );
    }
    */

    // Get all term ID\'s in the taxonomy
    $taxonomy_terms = get_terms( $taxonomy, array(
        \'hide_empty\' => 0,
        \'fields\'     => \'ids\'
    ) );

    // Get all posts with the taxonomy terms
    $args = array(
      \'post_type\' => array( \'post\', \'page\', \'cpt\' ),
      \'posts_per_page\' => -1,  // to show all posts
      \'tax_query\' => array(
        array(
          \'taxonomy\' => $taxonomy,
          \'field\'    => \'id\',
          \'terms\'    => $taxonomy_terms
        )
      )
    );

    $tax_query = new WP_Query( $args );

    if ( $tax_query->have_posts() ) : while ( $tax_query->have_posts() ) : $tax_query->the_post();

结束

相关推荐

Get_Terms中的count参数对输出没有影响/不起作用

我正在尝试获取id为的类别的子类别的类别计数$categoryId.在里面the documentation for the term query object, 这是获取\\u terms的主要参数count 参数已列出,说明如下:(bool)是返回术语计数(true)还是返回术语对象数组(false)。如果为true,则优先于$字段。默认值为false。基于此,我认为下面的代码应该返回一个整数项计数。但是,它不会返回一个术语对象数组,就像我没有包含count 论点我用值1、“true”、“true”和