GET_POST_PERMALINK()和自定义永久链接重写

时间:2016-04-19 作者:Fafanellu

我一直在研究一个名为“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-postwww.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);

1 个回复
最合适的回答,由SO网友:Z. Zlatev 整理而成

问题一定是如何定义post变量。你认为这是全球$post 但情况并非总是如此,尤其是在档案等非单数页中。

过滤器本身提供了正确的post实例,它被作为第二个参数调用。

function product_type_permalink( $post_link, $post ) {

     // current post is already defined.
...
}
也不要被你的代码在functions.php. 它会在每次WP页面加载时加载,包括在admin中。

相关推荐