WordPress - 按网址请求自定义字段值

时间:2016-11-11 11:11:26

标签: php wordpress

我有这样的网址: 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]',

1 个答案:

答案 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;