WordPress: solicitud de publicación por URL con valor de campo personalizado

Tengo una URL como esta: example.com/movies/157336/Interstellar

Para referencia: example.com/movies/%movie_id%/%movie_name%

Tenga en cuenta que el movie_id es un campo personalizado y no el ID de la publicación real. Movie_name es la publicación de título de publicación, pero solo está ahí por motivos de SEO.

Necesito WordPress para cargar la página en función del campo personalizado movie_id que se encuentra en la URL y no utilizar el nombre de la página, y si no se encuentra el movie_id, arroje el error 404 normal.

El principal problema que tengo es que parece que no puedo hacer que WordPress cargue una página basada en el campo personalizado movie_id de la URL, siempre usa movie_name como punto de referencia.

¿Cómo sé eso? Bueno, la URL correcta sería example.com/movies/157336/Interstellar y si cambio el título a example.com/movies/157336/Intersterlarxyz , WordPress da un error 404. Y si cambio el ID, pero dejo el nombre correcto de la película, así: example.com/movies/123/Interstellar luego WordPress carga la página correcta.

En función de este comportamiento, es seguro decir que WordPress carga la página según la barra de páginas de la URL, en lugar de la ID de la película, y eso es lo que debo corregir.

Aquí está mi código hasta ahora:

movie-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 ); 

Si elimino el movie_name de la URL en add_rewrite_rule, WordPress simplemente carga la página de archivo de ese tipo de publicación. 'index.php?post_type=movies&movie_id=$matches[1]',

Si utilizo el nombre de la página en la reescritura de la URL, siempre carga la página según el nombre, en lugar de la película_id. 'index.php?post_type=movies&movie_id=$matches[1]&name=$matches[2]',

No movies.php código a continuación, pero movies.php podría ser así:

  '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  //code to create post