我有这样的网址: example.com/movies/157336/Interstellar
供参考: example.com/movies/%movie_id%/%MOVIE_NAME%
请注意,movie_id是自定义字段,而不是实际的帖子ID。 movie_name是帖子标题slug,但只是出于SEO的原因。
我需要WordPress根据网址中找到的自定义字段movie_id加载页面而不使用页面名称,如果找不到movie_id,则抛出常规404错误。
我遇到的主要问题是,我似乎无法让WordPress根据URL中的自定义字段movie_id加载页面,它总是使用movie_name作为参考点。
我怎么知道?那么正确的URL将是example.com/movies/157336/Interstellar
,如果我将标题更改为example.com/movies/157336/Intersterlarxyz
,则WordPress会出现404错误。
如果我更改ID但保留电影名称正确,如下所示:example.com/movies/123/Interstellar
那么WordPress仍会加载正确的页面。
基于这种行为,可以说WordPress根据URL中的页面slug而不是电影ID加载页面,这就是我需要解决的问题。
到目前为止,这是我的代码:
电影plugin.php
// Register Custom Post Type "movies"
function register_moviedb_post_type() {
register_post_type( 'movies',
array(
'labels' => array(
'name' => __( 'Movies' ),
'singular_name' => __( 'Movies' )
),
'taxonomies' => array('category'),
'public' => true,
'has_archive' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'movies','with_front' => FALSE),
'supports' => array( 'title', 'editor', 'custom-fields','comments','page-attributes','trackbacks','revisions', 'thumbnail')
)
);
flush_rewrite_rules();
}
add_action( 'init', 'register_moviedb_post_type' );
// Add custom rewrite tag 'movie_id'
function custom_rewrite_tag() {
add_rewrite_tag('%movie_id%', '([^/]+)', 'movie_id=');
}
add_action('init', 'custom_rewrite_tag');
// Add rewrite rule
function custom_rewrite_basic() {
add_rewrite_rule(
'^movies/([^/]*)/([^/]*)/?',
//'index.php?post_type=movies&movie_id=$matches[1]',
'index.php?post_type=movies&movie_id=$matches[1]&name=$matches[2]',
'top'
);
}
add_action('init', 'custom_rewrite_basic');
// Query var 'movie_id'
function add_query_vars_filter( $vars ){
$vars[] = "movie_id";
return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );
// Custom Page Template
function custom_movie_page_template() {
if ( is_singular( 'movies' ) ) {
add_filter( 'template_include', function() {
return plugin_dir_path( __FILE__ ) . '/movies.php';
});
}
}
add_action( 'template_redirect', 'custom_movie_page_template' );
// Create custom post type link for movies
function movie_post_type_link( $link, $post = 0 ){
if ( $post->post_type == 'movies' ){
$id = $post->ID;
$post = &get_post($id);
$movie_id = get_post_meta($post->ID,'movie_id', true);
empty ( $post->slug )
and $post->slug = sanitize_title_with_dashes( $post->post_title );
return home_url(
user_trailingslashit( "movies/$movie_id/$post->slug" )
);
} else {
return $link;
}
}
add_filter( 'post_type_link', movie_post_type_link, 1, 2 );
如果我从add_rewrite_rule中的URL中删除movie_name,WordPress只会加载该帖子类型的存档页面。
'index.php?post_type=movies&movie_id=$matches[1]',
如果我在URL重写中使用页面名称,它总是根据名称而不是movie_id加载页面。
'index.php?post_type=movies&movie_id=$matches[1]&name=$matches[2]',
答案 0 :(得分:0)
我没有测试下面的代码,但movies.php
可能是这样的:
<?php $movieId = (int)get_query_var('movie_id') ;
if(movieId ==! 0):
$args = array(
'post_type' => 'movies',
'posts_per_page' => 1,
'meta_key' => 'movie_id',
'meta_value' => $movieId
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
//code that display data
<?php endwhile; else : ?>
//code to create post
<?php endif;
else:
//normal loop
endif;