如何在WordPress新版本中获取主要类别名称

时间:2016-06-05 作者:MMTDesigner

wordpress中有一个新特性引入了primary类别。选择类别时,可以指定主要类别。

我的问题是,如何使用Wordpress核心函数获取主要类别名称?

如果没有函数,你能帮我得到主类别的第一个子类吗?

例如:
主类别--1类儿童
--2类儿童
--3类儿童

我需要一只猫。

谢谢你的帮助。

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

我看到这个问题自去年以来受到了很多关注,我想用正确的方式回答这个问题。

如果已安装,wordpress中没有主类别Yoast SEO 插件,则新功能将出现在Single Posts 在管理区域中选择类别,以选择主要类别。

要获得主要类别,可以使用我提供的以下函数:

if ( ! function_exists( \'get_primary_taxonomy_id\' ) ) {
function get_primary_taxonomy_id( $post_id, $taxonomy ) {
    $prm_term = \'\';
    if (class_exists(\'WPSEO_Primary_Term\')) {
        $wpseo_primary_term = new WPSEO_Primary_Term( $taxonomy, $post_id );
        $prm_term = $wpseo_primary_term->get_primary_term();
    }
    if ( !is_object($wpseo_primary_term) && empty( $prm_term ) ) {
        $term = wp_get_post_terms( $post_id, $taxonomy );
        if (isset( $term ) && !empty( $term ) ) {
            return wp_get_post_terms( $post_id, $taxonomy )[0]->term_id;
        }
        return \'\';

    }
    return $wpseo_primary_term->get_primary_term();
}
}
首先,它将检查Yoast SEO是否正在安装和激活,然后它将尝试获取主要类别。如果没有安装Yost,那么它将获取所有类别并返回第一个类别。

请注意,此函数也适用于具有自定义分类法的自定义帖子类型。

如果要获取可以使用的类别(术语)对象,此函数将在末尾返回类别(术语)IDget_term($ID, $taxonomy) 并传入ID。

新建编辑:

如果您正在使用Rank Math,并且希望使用此插件获取主分类集,那么以下代码可能会有所帮助:

   if (class_exists(\'RankMath\')) {
        $primary_tax = get_post_meta( $post_id, \'rank_math_primary_category\', true );
        if (!empty($primary_tax)) {
            return get_term( $primary_tax, $taxonomy );
        }
    }
我建议在Yoast之后再加上这个if 陈述

SO网友:Eqhes

我编辑了MMT Designer function. 这对我来说更有效:

if ( ! function_exists( \'get_primary_taxonomy_id\' ) ) {
    function get_primary_taxonomy_id( $post_id, $taxonomy ) {
        $prm_term = \'\';
        if (class_exists(\'WPSEO_Primary_Term\')) {
            $wpseo_primary_term = new WPSEO_Primary_Term( $taxonomy, $post_id );
            $prm_term = $wpseo_primary_term->get_primary_term();
        }
        if ( !is_object($wpseo_primary_term) || empty( $prm_term ) ) {
            $term = wp_get_post_terms( $post_id, $taxonomy );
            if (isset( $term ) && !empty( $term ) ) {
                return $term[0]->term_id;
            } else {
                return \'\';
            }
        }
        return $wpseo_primary_term->get_primary_term();
    }
}

SO网友:cjbj

回答第二个问题:get_categories() 允许您传递一大堆参数,其中一个恰好是子类别。

首先获取父类别。我用过get_category_by_slug 但您可以使用任何其他方法来获取它,例如Yoasts函数来检索主类别。

$category = get_category_by_slug( \'category-name\' );
然后获取所有子类别:

$args = array(
\'type\'                     => \'post\',
\'child_of\'                 => $category->term_id,
\'orderby\'                  => \'name\',
\'order\'                    => \'ASC\', // or any order you like
\'hide_empty\'               => FALSE,
\'hierarchical\'             => 1,
\'taxonomy\'                 => \'category\',
); 
$child_categories = get_categories($args );
最后选择第一个元素(如果有):

if !empty($child_categories) $first_child = $child_categories[0];

SO网友:Arash Rabiee

这不是针对wordpress,而是针对seo插件,您可以使用以下功能

function get_post_primary_category($post_id, $term=\'category\', 
   $return_all_categories=false){
   $return = array();

if (class_exists(\'WPSEO_Primary_Term\')){
    // Show Primary category by Yoast if it is enabled & set
    $wpseo_primary_term = new WPSEO_Primary_Term( $term, $post_id );
    $primary_term = get_term($wpseo_primary_term->get_primary_term());

    if (!is_wp_error($primary_term)){
        $return[\'primary_category\'] = $primary_term;
    }
}

if (empty($return[\'primary_category\']) || $return_all_categories){
    $categories_list = get_the_terms($post_id, $term);

    if (empty($return[\'primary_category\']) && !empty($categories_list)){
        $return[\'primary_category\'] = $categories_list[0];  //get the first 

    }
    if ($return_all_categories){
        $return[\'all_categories\'] = array();

        if (!empty($categories_list)){
            foreach($categories_list as &$category){
                $return[\'all_categories\'][] = $category->term_id;
            }
        }
    }
}

return $return;
}
此函数由编写lab21.gr

SO网友:Fellipe Sanches

用于返回当前父类别的本机Wordpress解决方案。

function primary_categories($arr_excluded_cats) {

if($arr_excluded_cats == null) {
    $arr_excluded_cats = array();
}

$post_cats = get_the_category();

$args = array(
  \'orderby\' => \'name\',
  \'order\' => \'ASC\',
  \'parent\' => 0
);

    $primary_categories = get_categories($args);

    foreach ($primary_categories as $primary_category) {

        foreach ($post_cats as $post_cat) {
            if(($primary_category->slug == $post_cat->slug) && (!in_array($primary_category->slug, $arr_excluded_cats))) {
                return $primary_category->slug;
            }
        }
    }
}

//if you have more than two parent categories associated with the post, you can delete the ones you don\'t want here
$dont_return_these = array(
        \'receitas\',\'enciclopedico\'
    );

//use the function like this:
echo primary_categories($dont_return_these);
备注:

如果post只有一个父类别,请传递null而不是数组,如果希望另一个输出而不是slug,请将其更改为返回$primary\\u category->slug

SO网友:msmosavar

我刚刚重构了Eqhes 答复稍微干净一点的代码:)

if (!function_exists(\'get_primary_taxonomy_id\')) {
    function get_primary_taxonomy_id($post_id, $taxonomy) {
        $prm_term = \'\';
        $wpseo_primary_term = \'\';

        if (class_exists(\'WPSEO_Primary_Term\')) {
            $wpseo_primary_term = new WPSEO_Primary_Term($taxonomy, $post_id);
            $prm_term = $wpseo_primary_term->get_primary_term();
        }

        if (is_object($wpseo_primary_term) && !empty($prm_term)) {
            return $wpseo_primary_term->get_primary_term();
        }

        $term = wp_get_post_terms($post_id, $taxonomy);

        if (isset($term) && !empty($term)) {
            return $term[0]->term_id;
        }

        return \'\';
    }
}

SO网友:Serge Andreev

我使用sCategory Permalink插件https://wordpress.org/plugins/scategory-permalink/

$category_primary_id = get_post_meta(get_the_ID(), \'_category_permalink\', true);
if (!empty($category_primary_id)) {
    $category = get_category($category_primary_id);
    var_dump($category->name);
}