Resolver conflicto entre nombre de tipo de post personalizado vs. enlace permanente de página (mismo slug)
Tengo un tipo de post personalizado llamado "visningshus", y también una Página con ese mismo slug. Esto es como debe (tiene que) ser.
Actualmente, "http://my-site.com/visningshus" lista todas las entradas de ese tipo. Quiero mostrar la página que tiene ese slug de enlace permanente en su lugar.
¿Cómo puedo hacer que WordPress no dé precedencia al nombre del tipo de post, sino al enlace permanente, y muestre la Página?

Funcionó perfectamente - pero ahora todos los enlaces permanentes que comienzan con el nombre del tipo de contenido personalizado devuelven un error 404, a pesar de que son correctos en wp-admin y no parece haber ninguna reescritura ocurriendo. Es decir, todos los enlaces permanentes son correctos en el sitio, pero todas las entradas personalizadas devuelven un 404. ¿Puedes ayudarme con eso? :)

@HenrikErlandsson Tal vez tu tipo de contenido tenga el mismo nombre que una página. En este caso te recomiendo que cambies el nombre de tu tipo de contenido. Ejemplo: Nombre del tipo de contenido personalizado - Antes: products Después: cpt_products.

No tengo suficiente reputación para comentar en la publicación de @Carl, pero su respuesta es la correcta (al menos para esta situación de mantener el slug de página y el slug del tipo de contenido personalizado iguales y no usar un archivo archive.php)
Pero su respuesta generaría errores con la paginación. Para evitar errores de paginación:
add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');
Esto revisa la paginación, captura el número de página, y luego lo fuerza a usar la página con el slug coincidente, insertando la variable de página.
Esto además de 'has_archive' => false,
mencionado arriba debería lograr la funcionalidad deseada.
Como otros mencionaron, asegúrate de limpiar las reglas de reescritura visitando Ajustes > Enlaces permanentes después de hacer este cambio.
Espero que esto ayude a alguien, porque sé que esto me dejó perplejo durante mucho tiempo.

¡Hola Henrik!
Creo que todo lo que necesitas hacer es agregar una regla de reescritura a las reglas de reescritura de WordPress que ya han sido creadas. Añade este fragmento de código al functions.php de tu tema o inclúyelo como un plugin separado...
add_action('init', function () {
add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
flush_rewrite_rules();
}, 1000);

Si alguien usa esto, elimina flush_rewrite_rules();
No deberías cambiar las reglas de reescritura en init
cada vez. Recarga una vez y luego elimínalo, o purga manualmente los enlaces permanentes yendo a la configuración de enlaces permanentes en el panel de administración y haciendo clic en "Guardar cambios".

De todas las respuestas aquí, ¡esta fue la que funcionó para mí! Muchas gracias.

RE: flush_rewrite_rules()
- realmente no es una buena idea usar esta función en un hook init
- o cualquier otro hook que se ejecute frecuentemente. Esto hará que tu instalación de WordPress purgue las reglas de reescritura de la base de datos y las vuelva a insertar por cada carga de página, lo cual es una sobrecarga innecesaria, razón por la cual WordPress no lo hace por sí mismo. Después de crear la regla de reescritura, simplemente ve a Ajustes > Enlaces permanentes y haz clic en guardar - esto purgará manualmente las reglas de reescritura una sola vez, que es todo lo necesario.

Si registraste el tipo de contenido personalizado tú mismo, puedes cambiar el estado del archivo y la URL en tu tema o plugin.
'has_archive' => true,
habilita el archivo en el enlace permanente del tipo de contenido. Así que cambia eso a:
'has_archive' => false,
deshabilitará el archivo.
'has_archive' => 'custom-slug',
habilitará el archivo en un slug personalizado(http://my-site.com/custom-slug/).
Si un plugin o tu tema lo registra, puedes deshabilitarlo como lo hizo krafter. También puedes usar un slug personalizado para el archivo.
register_post_type( 'visningshus',
array(
[...]
'has_archive' => 'custom-slug',
[...]
)
);
Si necesitas tanto la página como el archivo, la mejor manera sería poner el archivo en un slug personalizado diferente.

Lo resolví sin resolver el conflicto. Crea una página con el slug visningshus y escribe lo que quieras en ella. Toma nota del ID de esta página.
Crea y personaliza la plantilla archive-custom-post-type.php como prefieras (lo más probable es que simplemente uses una plantilla de página) pero reemplaza la parte del loop con:
$recent = new WP_Query("page_id=tu-id-de-pagina");
while($recent->have_posts()) : $recent->the_post();
the_content();
endwhile;
Luego, cuando vayas a http://mi-sitio.com/visningshus verás el contenido gestionado por la página en la URL correcta.
Avísame si funciona.

Esto también tiene algunos efectos secundarios como que el encabezado y todo lo demás aún se crea como si fuera una página de archivo y no una página normal. No recomendaría usar esa solución.

Aquí hay una solución general para priorizar la paginación sobre el contenido de tipos de entrada personalizados para CUALQUIER slug de tipo de entrada personalizado.
// priorizar la paginación sobre la visualización del contenido de tipos de entrada personalizados
add_action('init', function() {
add_rewrite_rule(
'(.?.+?)/page/?([0-9]{1,})/?$',
'index.php?pagename=$matches[1]&paged=$matches[2]',
'top'
);
});
Además de agregar este fragmento de código, también debes asegurarte de que tu tipo de entrada personalizado tenga archive = false
Y por último pero no menos importante, ve a la página de configuración de Enlaces permanentes Ajustes > Enlaces permanentes (/wp/wp-admin/options-permalink.php) y guarda la configuración actual para actualizar la estructura de enlaces en la página.
