重写自定义POST类型插件的规则

时间:2016-12-09 作者:seelescript

我被重写规则弄糊涂了,需要帮助。

我创建了一个带有自定义元“brand”的自定义帖子类型“products”。

名为milk的产品的URL将为mysite.com/products/milk, 我需要URL包括这样的品牌,mysite.com/brand-brandname/milk

Some examples:mysite.com/brand-supermilk/milk 其中“supermilk”是牛奶定制元数据中的品牌

mysite.com/brand-goodproducts/coffe 好产品就是品牌

我有这个规则并重写:

$args = array(
\'rewrite\' => array(\'slug\' => \'brand-%brand_name%\', \'with_front\' => false),

);
register_post_type(\'products\', $args);
function wptuts_custom_tags() {
add_rewrite_rule("^brand-([^/]+)?",\'index.php?post_type=products&brand_name=$matches[1]\',\'top\');

flush_rewrite_rules();

}

add_action(\'init\',\'wptuts_custom_tags\');



 function my_post_type_link_filter_function($post_link, $id = 0, $leavename = FALSE) {
if (strpos(\'%brand_name%\', $post_link) === FALSE) {
    $post = &get_post($id);
    $brand_name =get_post_meta($post->ID,\'brand\',true);

    if(empty($brand_name)){$brand_name = \'default\';}
    $post_link = str_replace(\'%brand_name%\',$brand_name, $post_link);

    return $post_link;


 }
}

add_filter(\'post_type_link\', \'my_post_type_link_filter_function\', 1, 3);
当我添加新产品帖子时,所有这些都会在管理员中显示正确的URL,但会显示404或帖子的产品列表,但不会显示产品页面。

1 个回复
SO网友:Milo

当您使用更复杂的格式来slug 中的参数register_post_type. 在这种情况下,我们必须使用add_permastruct.

此示例添加了post类型和额外规则,以使用正确的URL启用单一产品和品牌存档:

function wpd_products_post_type() {

    // post type args
    // rewrite and has_archive must be true!
    $args = array(
        \'public\' => true,
        \'rewrite\' => true,
        \'has_archive\' => true,
        \'supports\' => array( \'title\', \'custom-fields\' ),
    );

    register_post_type(
        \'products\',
        $args
    );

    // so WP will parse brand_name into query vars
    add_rewrite_tag(
        \'%brand_name%\',
        \'([^&]+)\'
    );

    // this sets the actual structure the post type will use
    add_permastruct(
        \'products\',
        \'brand-%brand_name%/%products%\',
        array( \'with_front\' => false )
    );

    // to enable product archives by brand
    add_rewrite_rule(
        "^brand-([^/]+)?",
        \'index.php?post_type=products&brand_name=$matches[1]\',
        \'top\'
    );

}
add_action( \'init\',\'wpd_products_post_type\' );
您仍然需要post_type_link 筛选以将元值插入到单个产品URL中。

您还需要添加pre_get_posts filter 对于产品归档,为您的brand_name.

您还可以添加其他pre_get_posts 过滤要添加到元查询中的单一产品,因为您可能会发现,您当前可以将任何想要的值作为品牌名称放在URL中,查询将成功,因为WordPress默认只查询slug。

相关推荐

为什么我的可过滤公文包页面在Slug按钮和Slug输出WORDRPESS之间不能完美地工作?

我目前在Wordpress中有一个公文包自定义页面,可以根据需要工作,但我有一个问题。问题是,当我单击其中一个slug按钮时,主体/输出不是我想要的那样工作,例如在slug IOS中有3个项目,当我单击IOS slug中的“显示3个项目”时,应该是这样,但在这只显示1个项目。我读过很多类似于这个问题的教程,但都没有解决,请有人帮帮我,我一直在尝试解决这个问题,但仍然没有成功。以下是我读过的一篇文章:https://danny.care/a-responsive-filterable-portfolio-t