Mon problème est celui pour lequel je n'arrive pas à trouver une solution.
J'ai 2 types de messages personnalisés, Mangas
et Chapters
, chaque chapitre publié sera toujours connecté à un manga via le champ de relation ACF.
La structure actuelle du lien permanent pour ce chapitre est site.com/chapters/chapter-title
et ce que je veux, c'est site.com/mangas/connected-manga/chapter-title
Puisque wordpress n'offre pas beaucoup de relations post-à-post, le champ relationnel d'ACF est idéal pour cela et j'ai tout prévu, à l'exception de celui-ci ... le lien permanent.
Toute aide serait appréciée. S'il vous plaît gardez à l'esprit que je ne veux pas utiliser un plugin supplémentaire pour cela.
Vous pouvez ajouter ce qui suit sous forme de plug-in ou dans votre fichier de thèmes functions.php
. Ce que nous devons faire, c'est ajouter une balise de réécriture, une requête personnalisée, et enfin remplacer la balise de réécriture par le message correspondant. Certaines choses peuvent varier de mon code au vôtre. Je suppose que chapters
est le slug de type publication et que le champ relationnel renvoie un ID au lieu d'un objet, vous devrez peut-être modifier ces éléments en fonction de votre configuration.
Lorsque vous créez votre type de message chapters
, vous devez notamment ajouter l’espace réservé sur le slug de réécriture:
/**
* Create Rewrite Tag
* We'll be able to hook in and replace this placeholder
*
* @return void
*/
function wpse285382_chapters_setup() {
// Add rewrite tag
add_rewrite_tag(
'%manga%', // Placeholder
'([^&]+)', // Regex
'manga=' // Expected query var
);
// Assign rewrite tag in post registation
register_post_type( 'chapters', array(
/* ... */
'rewrite' => array( 'slug' => 'mangas/%manga%', 'with_front' => false ),
/* ... */
) );
}
add_action( 'init', 'wpse285382_chapters_setup' );
/**
* Replace the placeholder rewrite tag with expected manga
*
* @param String $post_link
* @param WP_Post $post
*
* @return String $post_link
*/
function wpse285382_chapter_link_replacements( $post_link, $post ) {
// No Post ID? Drop out
if( empty( $post ) ) {
return $post_link;
}
// Make sure our post type is correct
if( empty( $post ) || 'chapters' !== $post->post_type ) {
return $post_link;
}
// Get related manga field
$manga = get_field( 'related_manga', $post->ID );
if( ! empty( $manga ) ) {
// Grab Post Slug
$manga_slug = get_post_field( 'post_name', $manga );
// Replace rewrite tag in the given URL
$post_link = str_replace( '%manga%', $manga_slug, $post_link );
}
return $post_link;
}
add_filter( 'post_type_link', 'wpse285382_chapter_link_replacements', 9, 2 );
Ce dernier bit devrait rediriger les publications incompatibles. Nous nous assurons de travailler avec un slug, nous avons un identifiant de post associé, et le slug donné et le slug correspondant sont identiques, s'ils ne le sont pas, nous les redirigeons vers la page des archives vous devez les indiquer).
/**
* Redirect mismatched related posts
*
* @return void
*/
function wpse285382_chapter_redirects() {
global $post, $wp_query;
if( ! is_singular( 'chapterss' ) ) {
return;
}
$redirect_to = get_post_type_archive_link( 'chapters' );
$given_slug = $wp_query->get( 'manga' );
$expected_manga = get_field( 'related_manga', $post->ID );
if( empty( $given_slug ) || empty( $expected_manga ) ) {
wp_redirect( $redirect_to );
exit();
}
$expected_slug = get_post_field( 'post_name', $expected_manga );
if( $given_slug !== $expected_slug ) {
wp_redirect( $redirect_to );
exit();
}
}
add_action( 'template_redirect', 'wpse285382_chapter_redirects' );
Je pense que vous devez utiliser le pluginType de message personnalisé Permalienspour le faire