WordPress – запрос сообщения по URL с настраиваемым значением поля

У меня есть URL-адрес: example.com/movies/157336/Interstellar

Для справки: example.com/movies/%movie_id%/%movie_name%

Обратите внимание, что movie_id – это настраиваемое поле, а не фактический идентификатор сообщения. Имя movie_name – это заголовок сообщения, но он доступен только для SEO.

Мне нужно, чтобы WordPress загружал страницу на основе настраиваемого поля movie_id, найденного в URL-адресе, и не использовал имя страницы, а если movie_id не найден, выбросьте обычную ошибку 404.

Основная проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить WordPress загружать страницу на основе настраиваемого поля movie_id из URL-адреса, она всегда использует имя movie_name в качестве контрольной точки.

Откуда я знаю это? Ну, правильный URL-адрес будет example.com/movies/157336/Interstellar и если я изменю заголовок на example.com/movies/157336/Intersterlarxyz тогда WordPress выдаст ошибку 404. И если я изменил идентификатор, но оставил имя фильма правильным, например: example.com/movies/123/Interstellar то WordPress все еще загружает правильную страницу.

Основываясь на этом поведении, можно с уверенностью сказать, что WordPress загружает страницу на основе пропусков страницы из URL-адреса, а не идентификатора фильма, и это то, что мне нужно исправить.

Вот мой код:

фильм-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 ); 

Если я удалю имя фильма из URL-адреса в add_rewrite_rule, 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]',

Я не тестировал код ниже, но 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;