使用自定义帖子类型

时间:2018-04-05 05:29:14

标签: php wordpress url-rewriting custom-post-type permalinks

如何在永久链接中将元值附加到自定义帖子类型? 我有像www.abc.com这样的网址 以及帖子标题,我想添加两个元值,即日期为年/月&自定义类型的公司名称永久链接。

所以,我期待的最终永久链接是这样的:

www.abc.com/2018/04/best-car-this-year-Honda

在此之前尝试了许多链接,没有一个完美无缺。

add_action('init', 'Theme2035_detail_register');
//Registering new custom post type - Detail

function Theme2035_detail_register() {    

    $ldate ='/'; // to remove post type from permalink 
    $labels = array(
        'add_new' => __('Add New Detail', 'espresso'),          
        'name' => __('Detail','espresso'),     
        'singular_name' => __('Detail', 'espresso'),
        'add_new_item' => __('Add New Detail', 'espresso'),
        'edit_item' => __('Edit Detail Item', 'espresso'),
        'new_item' => __('New Detail', 'espresso'),
        'view_item' => __('View Detail', 'espresso'),
        'search_items' => __('Search Detail', 'espresso'),
        'not_found' =>  __('No Detail have been added yet', 'espresso'),
        'not_found_in_trash' => __('Nothing found in Trash', 'espresso'),
        'parent_item_colon' => ''
    );

    $args = array(  
        'labels' => $labels,  
        'public' => true,  
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => false,        
        'rewrite' => array( 'slug' => $ldate, 'with_front' => false ),
        'supports' => array('title', 'editor','thumbnail','comments'),
        'has_archive' => true,
        'taxonomies' => array('post_tag'),
        'menu_icon'  => 'dashicons-format-office',
       );  

    register_post_type( 'detail' , $args );  
} 

我的帖子标题是今年最好的车,所以在这里你可以看到我的默认自定义页面网址是这样的:

www.abc.com/best-car-this-year

我想要获得的是在永久链接中的自定义帖子标题之前添加日期,并在永久链接之后添加品牌名称。它看起来像这样:

www.abc.com/2018/04/best-car-this-year_HONDA

日期可以在日期添加,品牌名称将从后元表中提取。

2 个答案:

答案 0 :(得分:1)

有很多解决方案,可以根据需要用于构建网址结构。以下是获取www.abc.com/2018/04/best-car-this-year_HONDA

等网址结构的工作解决方案之一
add_action('init', 'Theme2035_detail_register');
function Theme2035_detail_register() {

    $ldate ='/%detail_year%/%detail_monthnum%';
    $labels = array(
        'add_new' => __('Add New Detail', 'espresso'),
        'name' => __('Detail','espresso'),
        'singular_name' => __('Detail', 'espresso'),
        'add_new_item' => __('Add New Detail', 'espresso'),
        'edit_item' => __('Edit Detail Item', 'espresso'),
        'new_item' => __('New Detail', 'espresso'),
        'view_item' => __('View Detail', 'espresso'),
        'search_items' => __('Search Detail', 'espresso'),
        'not_found' =>  __('No Detail have been added yet', 'espresso'),
        'not_found_in_trash' => __('Nothing found in Trash', 'espresso'),
        'parent_item_colon' => ''
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => false,
        'rewrite' => array( 'slug' => $ldate, 'with_front' => false),
        'supports' => array('title', 'editor','thumbnail','comments'),
        'has_archive' => true,
        'taxonomies' => array('post_tag'),
        'menu_icon'  => 'dashicons-format-office',
    );

    register_post_type( 'detail' , $args );
}

add_filter('post_type_link', 'ww_construct_permalink', 1, 2);
function ww_construct_permalink( $permalink, $post ){
    $year_mask = '%detail_year%';
    $month_mask = '%detail_monthnum%';
    if( strpos($permalink, $year_mask) === false && strpos($permalink, $month_mask) === false ) {
        return $permalink;
    }

    $year = date("Y", strtotime($post->post_date));
    $month = date("m", strtotime($post->post_date));

    return str_replace([$year_mask,$month_mask], [$year, $month], $permalink );
}

我们的步骤:

  1. 您的变量$ldate我们定义为/%detail_year%/%detail_monthnum%,而不是我们可以使用%anything%之类的内容。但是我们需要确保它不会被其他一些插件/主题覆盖,这些插件/主题可能会使用相同的变体。
  2. 我们使用post_type_link过滤器来创建我们想要的网址,在检查$year_mask$month_mask以确定帖子类型是我们创建后,我们获取创建日期我们的帖子来自WP_Post object并返回我们想要的网址结构。
  3. 注意:可能需要打开Dashboard -> Permalinks -> Save(不更改内容)来刷新固定链接。

答案 1 :(得分:0)

您可以尝试使用以下代码。

add_filter( 'register_post_type_args', 'cpt_permalink_change', 10, 2 );
function cpt_permalink_change( $args, $post_type ) 
{   
    $args['rewrite']['slug'] = 'your permalink';
    return $args;
}//end of function

希望这对你有用。