Permalinks para que um tipo de postagem personalizado pareça ser filho de outro, não funcionando

4

Atualmente, tenho dois tipos de postagens, "produtos" e "produtos-dados", são tipos de post separados; no entanto, para todos os efeitos, product-data é um post filho de produtos. A relação é estabelecida por meio de um elemento meta para produtos-dados "pai" que terá um ID de postagem da postagem de produtos.

As postagens "produtos-dados" são criadas apenas de uma forma: um usuário clica em um produto no tipo de postagem de produtos e insere dados em uma janela pop-up. Isso usa wp_insert_post para criar uma postagem de dados de produtos e adiciona um elemento-meta "pai" com o valor da ID da postagem de "produtos". Esses dados são exibidos por meio de uma janela modal se um usuário clicar no tipo de produto.

Estou tentando ter seus permalinks da seguinte forma:

Link permanente do esquema para uma postagem "produtos" (para este exemplo, o ID dessa postagem é 123):

enlace

Permalink schema para uma postagem "products-data" que possui uma meta key / value de parent = > 123

enlace

Aqui está o código que estou usando para registrar o tipo de postagem e criar regras de reconfiguração; no entanto, depois de adicionar este código e liberar minhas regras de reconfiguração (configurações > permalink) ele funciona bem para um tipo de pós-produto "produtos" MAS quando tento acessar uma postagem "produtos" ele exibe a página inicial do site WordPress (NB this não é via redirecionamento, a barra de URL exibe o URL "produtos").

Eu estou querendo saber se a questão é que os dois permastructs aparecem que eles podem colidir uns com os outros, no entanto, nunca haverá uma instância disso na prática devido ao esquema de permastructs.

Qualquer ajuda seria muito apreciada sobre como resolver isso.

Código:

add_action ( 'init', 'register_product_post_types' );
add_action ( 'init', 'products_add_rewrite_rules' );
add_filter ( 'post_type_link', 'products_permalinks', 10, 3 );

function register_product_post_types() {    
    register_post_type( 'products',
        array(
                'supports' => array( 'title', 'editor', 'author',"custom-fields", "thumbnail", "excerpt", 'comments' ),
                'labels' => array(
                'name' => __( 'Products' ),
                'singular_name' => __( 'Products' )
            ),
        'public' => true,
        'has_archive' => false,
        'rewrite' => FALSE,
        )
    );

    register_post_type( 'products-data',
        array(
                'supports' => array( 'title', 'editor', 'author',"custom-fields" ),
                'labels' => array(
                'name' => __( 'Products-Data' ),
                'singular_name' => __( 'Products-Data' )
            ),
        'show_in_menu' =>'edit.php?post_type=products',
        'public' => true,
        'has_archive' => false,
        'rewrite' => FALSE,
        )
    );
}


function products_add_rewrite_rules() {
    global $wp_rewrite;
    $wp_rewrite->add_rewrite_tag('%products%', '([^/]+)', 'products=');
    $wp_rewrite->add_rewrite_tag('%products-data%', '([^/]+)', 'products-data=');
    $wp_rewrite->add_rewrite_tag('%parent%', '([^/]+)', 'parent=');
    $wp_rewrite->add_permastruct('products-data', '/products/%parent%/%products-data%', false);

}

function products_permalinks($permalink, $post, $leavename) {
    $no_data = 'no-data';
    $post_id = $post->ID;
    if($post->post_type != 'products-data' || empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft')))
        return $permalink;
    $data = sanitize_title(get_the_title(get_post_meta($post_id, 'parent', true)));
    if(!$data) $data = $no_data;
    $permalink = str_replace('%parent%', $data, $permalink);
    return $permalink;
}
    
por setterGetter 20.11.2012 / 14:59

1 resposta

1

Veja minha resposta aqui: enlace .

O problema que você está enfrentando é que os permastructs estão adicionando vários tipos de post personalizado ao URL, o que confunde o WordPress. Você precisará adicionar suas regras de reescrita usando add_rewrite_rule() .

    
por Matthew Boynes 23.05.2013 / 17:47