获取自定义分类的自定义URL

时间:2016-04-25 作者:CalvT

我有一个名为productpopups的自定义帖子类型,为了对它们进行排序,我有一个名为productcategory的自定义分类法。帖子类型有自己的特殊模板(single productpopup.php),我试图用一个指向该类别的链接来显示每个产品类别。我的问题如下:

每个productcategory的链接是sayexample.com/productcategory/category 但我想链接到的页面实际上是example.com/category

所以我编了这个:

<p>Categories: 
<?php 
$categories = get_the_terms( $post->ID, \'productcategory\' ); 
foreach( $categories as $category ) { 
    echo \'<a href="http://example.com/\'.$category->slug.\'">\'.$category->name.\'</a>, \'; 
}
?>
</p>
这是因为我设置的页面使用了与productcategory相同的slug,但它的粗糙和一次失误(就像输入错误)会破坏它。

我想做的是在分类法中添加一个自定义字段,在这里我可以指定页面url,然后可以调用该字段而不是http://example.com/.$category->slug

这可能吗?

Edit for additional clarification: 忘记这是一个url,我需要一个字段,在这里我可以输入数据,可以按产品查询,这样,如果一个产品有多个类别,就可以找到每个类别的信息。例如,假设产品A有两个类别,一个和两个,可以形成这样的表:

+-----------+----------+--------------+
| Name      | Category | Custom Value |
+-----------+----------+--------------+
| Product A | C 001    | CV 001       |
+-----------+----------+--------------+
| Product A | C 002    | CV 002       |
+-----------+----------+--------------+

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

我最终想出的解决问题的代码!

<?php
global $wpdb;
$catresult = array();
$postid = get_the_ID();
$query1c = "SELECT wp_posts.ID, wp_terms.`name` AS `Category`, wp_pods_productcategory.`pc-url` AS `Url`
FROM wp_posts
INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
INNER JOIN wp_terms ON wp_term_relationships.term_taxonomy_id = wp_terms.term_id
LEFT OUTER JOIN wp_pods_productcategory ON wp_pods_productcategory.id = wp_term_relationships.term_taxonomy_id
INNER JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_id
WHERE wp_term_taxonomy.taxonomy = \'productcategory\' AND wp_posts.ID =$postid
ORDER BY wp_terms.`name` ASC";
$categories = $wpdb->get_results( $query1c );
foreach ( $categories as $category )
{
array_push( $catresult, "<a href=\'".$category->Url."\'>".$category->Category."</a>" );
}
echo implode(\', \', $catresult);
?>
那么这是如何工作的呢?

<?php 这是开始标记,以便服务器知道接下来会发生什么php.

global $wpdb 这里我们告诉服务器,我们将连接到WordPress数据库。

$catresult = array(); 在这里,我们将创建用于存储数据的数组。

$postid = get_the_ID(); 在这里,我们获得了能够过滤查询的帖子id。

$query1c = "SELECT.... 在这里,我们放置查询,它选择我们想要的字段,并按wp_term_taxonomy.taxonomy = \'productcategory\'wp_posts.ID =$postid (这是我们使用$postid 之前)和订购人wp_terms.name ASC.

$categories = $wpdb->get_results( $query1c ) 这将运行查询,并将原始数据保存到$categories.

现在我们需要将原始数据转换为我们可以使用的数据,原始数据当前保存为$categories 但我们需要每个单独的结果,因此我们提出:

foreach ( $categories as $category) 这里有一个结果被称为$category

array_push( $catresult, "<a href=\'".$category->Url."\'>".$category->Category."</a>" ) 在这里,我们将每个结果单独“推送”到前面创建的数组-$catresult. 每个结果都有其链接(<a> 标签)。

最后一件事-由于我们希望这些类别在列表中,如果它们之间用逗号分隔,看起来会更好!因此:

echo implode(\', \', $catresult) 所以这里我们“内爆”数组,这意味着我们在数组的每个结果之间放置了一些东西,在本例中,逗号后跟空格。然后使用echo 命令

最后?> 告诉服务器关闭此php 部分

SO网友:omukiguy

很抱歉来晚了。这是我的解决方案

<?php
    //Retrieve the terms in productcategory taxonomy with posts (not empty)
    $terms = get_terms( array ( \'taxonomy\' => \'productcategory\', \'hide_empty\' => false, \'parent\' => 0, \'orderby\' => \'description\', \'order\' => \'ASC\' ));

    //loop through each term to get its attributes
    foreach ($terms as $term) {

        //Uncomment below code to see all the available attributes.
        //var_dump($term); 
        //die();
        $name        = $term->name;

        //PHP -> Store the link in variable to reuse
        //to get the link for the the particular term; you need to have the slug and pass it into the get_term_link() function.
        //the second argument is the taxonomy name in this case productcategory.
        $cat_link    = get_term_link( $term->slug, \'productcategory\' );

?>

<a href="<?php echo $cat_link; ?>"><?php echo $name; ?></a>

<?php
    }

?>

SO网友:Victor

如果您自己创建了分类法,则可以为自定义分类法设置自己的slug。例如:

register_taxonomy(
    \'productcategory\',
    array(
        \'productpopups\',
    ),
    array(
        \'labels\' => array(
            \'name\' => __(\'Categories\', \'text-domain\'),
        ),

        // --- set taxonomy slug ---
        \'rewrite\' => array(
            \'slug\' => \'%productcategory%\',  // set taxonomy slug
            \'with_front\' => false,          // set this to false
        )
        // -------------------------
    )
);

flush_rewrite_rules();  // <-- don\'t forget to add this line of code!