获取基于变量的分类描述

时间:2015-07-21 作者:mdcrtv

我试图显示分类描述,该描述基于页面设置为显示的分类(使用变量设置)

实际上,无论设置了哪个类别变量,我只看到了第一个描述。

我是这样设置的:

我构建了一个名为“product”的自定义帖子类型,并建立了一个名为“product\\u type”的分类法。

    //Register product post type
    add_action(\'init\', \'product_register\');
    function product_register() {
        $labels = array(
            \'name\' => (\'Products\'),
            \'singular_name\' => (\'Product\'),
            \'add_new\' => (\'Add New\'),
            \'add_new_item\' => (\'Add New Product\'),
            \'edit_item\' => (\'Edit Product\'),
            \'new_item\' => (\'New Product\'),
            \'view_item\' => (\'View Product\'),
            \'search_items\' => (\'Search\'),
            \'not_found\' => (\'Nothing found\'),
            \'not_found_in_trash\' => (\'Nothing found in Trash\'),
            \'parent_item_colon\' => \'\'
            );
        $args = array(
            \'labels\' => $labels,
            \'menu_icon\' => \'dashicons-tag\',
            \'public\' => true,
            \'has_archive\' => true,
            \'supports\' => array(\'title\', \'revisions\', \'editor\',\'thumbnail\'),
            \'capability_type\' => \'post\',
            \'rewrite\' => array("slug" => "product"), // Permalinks format
            );
        register_taxonomy(\'product_type\', array(\'product\'), array(
            \'hierarchical\' => true,
            \'label\' => \'Product Type\',
            \'singular_label\' => \'Type\',
            \'show_ui\' => true,
            \'show_admin_column\' => true,
            \'query_var\' => true,
            \'rewrite\' => true)
        );
        register_post_type( \'product\' , $args );
    }
在wordpress后端,我加载了一些术语并添加了描述。

Admin category list with values归档产品。php的工作方式类似于登录页,但将接受来自名为$type的变量的信息来过滤内容。

    if (isset($_GET[\'type\']) || !empty($_GET[\'type\']) ) {
        $filtered = true;
        $type = $_GET[\'type\'];
    }
有了这些信息,我可以为包含该分类术语的项目设置WP\\u查询。

    if ($filtered == true) {
        $type = explode(\' \', $_GET[\'type\']);
        $taxonomy = array(
            array(
                \'taxonomy\' => \'product_type\',
                \'field\'    => \'slug\',
                \'terms\'    => $type
                )
            );
    $args = array(
        \'post_type\' => \'product\',
        \'posts_per_page\' => -1,
        \'order\' => \'DEC\',
        \'orderby\' => \'title\',
        \'offset\' => \'0\',
        \'tax_query\' => $taxonomy
        );
    $the_query = new WP_Query($args);
    if($the_query->have_posts()):
        $terms = get_the_terms( $post->ID, \'product_type\' );
    if($terms) {
        foreach( $terms as $term ) {
    echo $term->description; //always shows first term description, but should display description based on $type
    }
    }
    while($the_query->have_posts()):$the_query->the_post();
    the_title();
    the_content();
    endwhile;
    else: //nothing to show here
    endif;} else {
    // non-filtered page design
    }
该查询工作得很好,但正如我前面提到的,它只提取第一个分类描述。

这是要处理的部分:

    $terms = get_the_terms( $post->ID, \'product_type\' );
    if($terms) {
        foreach( $terms as $term ) {
    echo $term->description;
    }
    }
我猜它需要在查询中才能得到正确的描述,但这似乎没有什么区别。

我也尝试过:

    $term = get_term_by( $post->ID, $type, \'product_type\' );
    echo $term->description;
但这不会返回任何结果。

我没有主意了。我没有通过谷歌或搜索这个网站找到任何东西。

如有任何建议,敬请谅解。

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

这里有很多问题:

您不应该使用$_GET 未对其进行清理的变量。永远不要信任任何用户输入和URL参数。它们可能包含可能危害您的网站的恶意代码。清理和验证$_GET 变量,使用filter_input php函数

$filtered = filter_input( INPUT_GET, \'type\', FILTER_SANITIZE_STRING )
使用主查询并使用pre_get_posts 相应地筛选主查询。无需使用自定义查询,因为这是一个存档页

如果您试图将当前术语描述弄错,您应该使用get_term_by 获取包含所需信息的术语对象

这可能与此无关,但为什么不使用taxonomy.php 页面将按其应该的方式处理上述所有内容。你只需要冲洗你的永久性皮肤,一切都应该正常工作。但这是你需要在自己的时间里调查的事情

让我们首先整理归档页面。为了便于理解,我对代码进行了注释。我不知道您将通过多少个术语,但从您的代码中,我获得了比1更多的术语。如果没有,请查看代码并进行相应调整

$filtered = filter_input( INPUT_GET, \'type\', FILTER_SANITIZE_STRING );
if ( $filtered  ) {
    /**
     * I don\'t know if you will be passing more than one term. From your code it seems so
     */
    $types = explode( \' \', $filtered ); 
    foreach ( $types as $type ) {

        /**
         * Get the term object. 
         *
         * I have used the slug here as it seems that you are passing the slug. Adjust as necessary
         *
         * @see get_term_by()
         */
        $term = get_term_by( \'slug\', $type, \'product_type\' );
        // Make sure that $term has a valid value before outputting anything
        if ( !empty( $term ) || !is_wp_error( $term ) )
            echo $term->description; // Show term description
    }
    /* Replace code above with the following if you are passing just one term
    $term = get_term_by( \'slug\', $filtered, \'product_type\' ); 
    if ( !empty( $term ) || !is_wp_error( $term ) )
        echo $term->description; // Show term description
    */
    if ( have_posts() ) {
        while( have_posts() ) {
            the_post();

            the_title();
            the_content();
        }
    }

} else {

    // non-filtered page design
    // I don\'t know what will be displayed here, so I\'m keeping the loop and this separate

}
这将对存档页面进行排序。默认情况下,以下内容默认通过,因此我们不会在操作中通过它们

支柱类型

偏移量。

所以,让我们看看我们的行动。我再次对代码进行了注释,使其易于理解。请注意,由于短数组语法,以下内容至少需要PHP 5.4以上([]) 正在使用中。对于旧版本,请回滚到旧数组语法(array())

add_action( \'pre_get_posts\', function ( $q ) 
{
    $filtered = filter_input( INPUT_GET, \'type\', FILTER_SANITIZE_STRING );
    if (    !is_admin() // Only target the front end
         && $q->is_main_query() // Only target the main query
         && $q->is_post_type_archive( \'product\' ) // Only target product archive page
         && $filtered // If we have a $_GET[\'type\'] variable
    ) {
        if ( isset( $q->get( \'tax_query\' ) ) ) //Get current tax query
            $tax_query = []; // Set current tax_query to an empty array

        // Set our new tax_query
        $tax_query = [
            [
                \'taxonomy\'         => \'product_type\',
                \'field\'            => \'slug\'
                \'terms\'            => explode( \' \', $filtered ),
                \'include_children\' => false
            ]
        ];
        $q->set( \'tax_query\', $tax_query ); // Set new tax_query
        $q->set( \'posts_per_page\', -1 ); // Get all posts
        $q->set( \'order\', \'DESC\' ); // Descending sort order
        $q->set( \'orderby\', \'title\' ); // Sort by title
    }
});
我希望这就是你需要的

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post