我一直在研究一个名为“product”的CPT,它有定制的永久链接。以下是CPT的一部分:
\'rewrite\' => array(
\'slug\' => \'catalog/%product-cat%\',
\'with_front\' => false
),
然后,我添加了一个过滤器,以按照我想要的方式正确重写链接:
add_filter(\'post_type_link\', \'product_type_permalink\', 10, 4);
在哪里
product_type_permalink
行为如下:它替换
%product-cat%
通过CPT“product”中定义的自定义post字段,然后返回链接。代码如下:
function product_type_permalink($post_link, $id=0) {
// current post
global $post;
// if it is not a product
if(!is_object($post) || $post->post_type!= \'product\') {
return $post_link;
}
else {
// retrieves the product category (which is a custom taxonomy)
if($terms = wp_get_object_terms($post->ID, \'category-product\'))
// must be done in order to avoid warnings when creating a new product
if (!empty($terms[0])) {
//retrieves the slog of "category-product"
$term = $terms[0]->slug;
// rewrites the permalink
$permalink = str_replace(\'%categorie-produit%\', $term, $post_link);
return $permalink;
}
}
}
因此,permalinks最终看起来是这样的:
www.mysite.com/catalog/lectures/a-custom-post
或
www.mysite.com/catalog/anythingelse/another-custom-post
.
上述所有操作均正常工作:它们在functions.php
子主题的文件。
现在,我已经为另一个名为“session”的CPT创建了一个自定义归档页面,在这个归档页面中,我需要获取一些产品的URL。每个“会话”都有一个自定义字段“产品”。
所以session-archive.php
该文件有一个WP查询,用于检索所有会话,我在该文件的某个地方写道:
//session_product is the custom field in the session CPT that references a product
if (!empty(get_post_meta( $id, \'session_product\', true ))) {
//gets the product id
$id_product = get_post_meta( $id, \'session_product\', true );
//gets the product title
$title_product = get_the_title($id_product);
//gets the permalink
$permalink_product = get_post_permalink($post = $id_product, $leavename = false);
}
除了permalink我什么都能找到
$leavename = false
(另一方面,设置为
false
默认情况下)保留在“%%”表格下:
catalog/%product-cat%/a-custom-post
显然,这是因为自定义归档文件与函数不同。php文件,我在其中定义了永久链接的重写。
但我能做些什么来解决这个问题呢?有没有办法考虑post_type_link
函数的过滤器。php文件以返回正确的永久链接?
谢谢
EDIT我使用了一个技巧来解决这个问题,但我的答案仍然是:为什么post\\u type\\u link过滤器位于函数中。在访问自定义存档页面时,是否未调用/考虑php?
无论如何,这里有一个窍门:在归档页面中,我为产品重写了永久链接
$permalink_product = str_replace(\'%category-product%\', \'product\', $permalink_product);