Reescreva / consulta para múltiplos tipos hierárquicos personalizados de postagem

Eu preciso produzir o seguinte: Dois tipos de publicação (coleção e colaboração) que são hierárquicos entre si. As collections podem ser pais para outras collections e colaborações.

  • /collection-a/collection-b/collection-c
  • /collection-a/collection-b/collaboration-a

Meu método foi para seqüestrar a regra de reescrita de página e adicionar uma tag de reescrita personalizada:

 function custom_rewrite_rules() { add_rewrite_rule( '(.?.+?)(?:\/([0-9]+))?\/?$', 'index.php path=$matches[1]&page=$matches[2]', 'top' ); } function custom_rewrite_tag() { add_rewrite_tag( '%path%', '([^&]+)' ); } add_action( 'init', __NAMESPACE__ . '\\custom_rewrite_rules', 10, 0 ); add_action( 'init', __NAMESPACE__ . '\\custom_rewrite_tag', 10, 0 ); 

Eu também cuidei dos links de postagem usando uma checkbox de meta de seleção personalizada e o seguinte filtro:

 add_filter( 'post_type_link' , __NAMESPACE__ . '\\post_type_link_handler', 10, 2 ); function post_type_link_handler( $url, $post ) { if ( ! in_array( $post->post_type, [ 'collection', 'collaboration' ], true ) ) { return $url; } $parents = get_post_ancestors( $post ); $intermediate_slug = ''; foreach ( array_reverse( $parents ) as $parent ) { $intermediate_slug .= trailingslashit( get_post_field( 'post_name', $parent ) ); } $post_link = home_url( user_trailingslashit( "$intermediate_slug$post->post_name" ) ); return $post_link; } 

Por enquanto, tudo bem. Os slugs para estes tipos de postagem são construídos como eu mencionei acima.

O meu problema vem quando tento usar pre_get_posts para determinar qual object carregar.

 function query_handler( $query ) { global $wp_query; if ( is_admin() || ! $query->is_main_query() || is_archive() ) { return; } $p = get_page_by_path( $query->query['path'], '', [ 'collection', 'collaboration', 'page' ] ); $query->set( 'p', $p->ID ); $query->set( 'post_type', get_post_type( $p->ID ) ); $query->is_single = true; $query->is_singular = true; $query->queried_object = $p; $query->queried_object_id = $p->ID; $query->is_home = false; // this makes sure the correct template loads, otherwise it will load index.php return $query; } add_filter( 'pre_get_posts', __NAMESPACE__ . '\\query_handler', 10, 1 ); 

Usando isso, eu posso acessar collections e colaborações usando as construções permalink mencionadas acima. Mas isso parece hackeado e várias coisas para quebrar como resultado: incluindo, mas não limitado a:

  • Página inicial 404s
  • Páginas com limas inexistentes ( site.com/asdfasdf ) carregam a página de índice (loop of posts)

Estou esquecendo de algo? Existe uma maneira melhor de fazer isso?

Solutions Collecting From Web of "Reescreva / consulta para múltiplos tipos hierárquicos personalizados de postagem"