首页 文章

WordPress - 请求由url发布的自定义字段值

提问于
浏览
1

我有这样的URL:example.com/movies/157336/Interstellar

供参考:example.com/movies/%movie_id%/%movie_name%

请注意,movie_id是自定义字段,而不是实际的帖子ID . movie_name是帖子 Headers slug,但只是出于SEO的原因 .

我需要WordPress根据URL中找到的自定义字段movie_id加载页面而不使用页面名称,如果找不到movie_id,则抛出常规404错误 .

我遇到的主要问题是,我似乎无法让WordPress根据URL中的自定义字段movie_id加载页面,它总是使用movie_name作为参考点 .

我怎么知道的?那么正确的URL将是 example.com/movies/157336/Interstellar ,如果我将 Headers 更改为 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

    我没有在下面测试代码,但 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;
    

相关问题