从自定义发布类型中删除辅助信息

时间:2013-12-09 作者:JoaMika

我想知道如何使用htaccess规则或任何其他合适的方法从自定义post类型的slug中删除前缀。

当前我的自定义帖子类型如下所示:

http://www.domain.com/os_estate/5-bedroom-property-for-sale
我只想这样:

http://www.domain.com/5-bedroom-property-for-sale
我可以通过插件实现这一点,但它显著增加了页面加载时间。。

Permalinks中的“我的常用设置”设置为“帖子名称”

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

有一种更简单、更轻的解决方案:

第一:注册帖子类型时,将自定义帖子类型的slug参数设置为“/”:

add_action( \'init\', \'register_my_post_type\' );
function register_my_post_type() {
    $args = array(
            //The rest of arguments you are currently using goes here
            \'rewrite\'    => array(
                             \'slug\' => \'/\'
                             )
     );
     register_post_type( \'my-post-type\', $args );   
}
第二:英寸preg_get_posts() 当只有$query->query[\'name\'] 存在:

add_action( \'pre_get_posts\', \'wpse_include_my_post_type_in_query\' );
function wpse_include_my_post_type_in_query( $query ) {

     // Only noop the main query
     if ( ! $query->is_main_query() )
         return;

     // Only noop our very specific rewrite rule match
     if ( 2 != count( $query->query )
     || ! isset( $query->query[\'page\'] ) )
          return;

      // Include my post type in the query
     if ( ! empty( $query->query[\'name\'] ) )
          $query->set( \'post_type\', array( \'post\', \'page\', \'my-post-type\' ) );
 }
第三:我发现在某些情况下,与页面和单个帖子存在冲突。我可以通过检查是否存在具有请求名称的页面并覆盖查询条件来避免此冲突,但我不确定是否会发生更多冲突:

add_action( \'parse_query\', \'wpse_parse_query\' );
function wpse_parse_query( $wp_query ) {

    if( get_page_by_path($wp_query->query_vars[\'name\']) ) {
        $wp_query->is_single = false;
        $wp_query->is_page = true;
    }

}
IMPORTANT: 您需要刷新重写规则。您可以通过在管理区域中激活permalink选项页面来实现这一点。这是必需的,因为我们正在注册一个新的重写规则,因此必须重新生成存储在数据库中的当前重写规则。

SO网友:Shazzad

//那么,首先使用一个函数来提及您的自定义帖子类型。

function my_custom_post_types(){
    return array(
        \'os_estate\', 
        \'os_villas\', 
        \'os_chalets\', 
        \'os_cottages\'
    );
}
//然后,过滤请求。

    add_action( \'parse_request\',\'my_custom_post_types_parse_request\', 999);

function my_custom_post_types_parse_request( $query ){

    if( isset($query->request) )
    {
        $req = explode(\'/\', ltrim($query->request,\'/\'));
        if( !is_admin() && isset($req[\'0\']) )
        {
            global $wpdb;
            $name = stripslashes($req[\'0\']);
            $_post = $wpdb->get_row( "SELECT * FROM $wpdb->posts WHERE post_status = \'publish\' AND post_name =\'". $name ."\' AND post_type IN (\'" . join("\', \'", my_custom_post_types() ) . "\')" );

            if( $_post )
            {
                $query->query_vars[\'error\'] = \'\';
                $query->query_vars[\'post_type\'] = $_post->post_type;
                $query->query_vars[\'name\'] = $name;
            }
        }
    }
}
//然后过滤所有所需的帖子类型链接。

add_filter( \'post_type_link\', \'my_custom_post_types_permalink\', 10, 2);

function my_custom_post_types_permalink( $post_link, $post ){
    if( in_array( $post->post_type, my_custom_post_types() ) && !empty($post->post_name) && $post->post_status == \'publish\' && \'\' != get_option(\'permalink_structure\') )
    {
        $post_name = $post->post_name;
        $post_link = home_url("/$post_name/");
    }
    return $post_link;
}
编辑:修复错误,根据编辑6个字符的最低要求添加此行

SO网友:pendjer

我认为您只需要在注册post类型的代码中加入重写规则。

只需放置此代码

$rewrite = array(
    \'slug\'                => \'\',
    \'with_front\'          => true,
    \'pages\'               => true,
    \'feeds\'               => true,
    );
$labels array();

和之前$args = array();

结束