Slug numérico em post filho

4

Eu entendo que existem dois tipos diferentes quando se trata de um tipo de postagem personalizado: -página -postar.

Onde page suporta páginas-filhas, e post não.

No entanto, quando tento criar uma página filha com apenas números, o wordpress coloca -2 por trás dela. Exemplo:

/ posttype / parent / 10-2 /

em vez do que eu queria:

/ posttype / parent / 10 /

Por que isso e como posso resolvê-lo? Eu tenho procurado por horas, mas eu não consigo encontrar uma solução, além de talvez seja uma limitação no Wordpress, fazer um conflito com o seu sistema de permalink de data. Eu não estou usando este sistema, mas isso pode ser verdade?

EDIT, mais algumas informações: Não há posts que possam entrar em conflito com o meu permalink. O permalink definitivamente não é levado.

Eu obtenho esse comportamento com uma instalação completamente nova do wordpress e apenas um tipo de postagem personalizada. Os únicos posts no banco de dados wordpress são 'parent' e '02'. Onde '02' se transforma em '02 -2 '.

Eu queria saber se talvez paginação / slug / page / 02 foi talvez a razão de lesmas numéricos não foram aceitos?

É importante notar que eu só recebo isso com slugs numéricos, / parent / child / não é um problema.

Eu vi algo sobre substituir os filtros, mas isso não vai simplesmente esconder o problema? Eu prefiro resolver isso.

O código que uso para registrar meu tipo de postagem personalizado:

    $labels = array(
    'name'                => _x( $options['euthus_posttype_meervoud'], 'Post Type General Name', 'text_domain' ),
    'singular_name'       => _x( $options['euthus_posttype'], 'Post Type Singular Name', 'text_domain' ),
    'menu_name'           => __( $options['euthus_posttype_meervoud'], 'text_domain' ),
    'name_admin_bar'      => __( $options['euthus_posttype_meervoud'], 'text_domain' ),
    'parent_item_colon'   => __( 'Parent Item:', 'text_domain' ),
    'all_items'           => __( 'All Items', 'text_domain' ),
    'add_new_item'        => __( 'Add New Item', 'text_domain' ),
    'add_new'             => __( 'Add New', 'text_domain' ),
    'new_item'            => __( 'New Item', 'text_domain' ),
    'edit_item'           => __( 'Edit Item', 'text_domain' ),
    'update_item'         => __( 'Update Item', 'text_domain' ),
    'view_item'           => __( 'View Item', 'text_domain' ),
    'search_items'        => __( 'Search Item', 'text_domain' ),
    'not_found'           => __( 'Not found', 'text_domain' ),
    'not_found_in_trash'  => __( 'Not found in Trash', 'text_domain' ),
);
$rewrite = array(
    'slug'                => $options['euthus_posttype_baseurl'],
    'with_front'          => true,
    'pages'               => false,
    'feeds'               => true,
);
$args = array(
    'label'               => __( 'euthus_childs', 'text_domain' ),
    'description'         => __( $options['euthus_posttype_meervoud'], 'text_domain' ),
    'labels'              => $labels,
    'supports'            => array( 'title', 'thumbnail', 'page-attributes',),
    'hierarchical'        => true,
    'public'              => true,
    'show_ui'             => true,
    'show_in_menu'        => true,
    'menu_position'       => 20,
    'menu_icon'           => 'dashicons-networking',
    'show_in_admin_bar'   => true,
    'show_in_nav_menus'   => true,
    'can_export'          => true,
    'has_archive'         => true,
    'exclude_from_search' => false,
    'publicly_queryable'  => true,
    'rewrite'             => $rewrite,
    'capability_type'     => 'page',
);
register_post_type( 'euthus_childs', $args );

Pelo que entendi, o 'capability_type' deve ser definido como page e não post para permitir hierárquico, onde defini-lo como 'post' não permite isso.

    
por Sleuteltje 02.05.2015 / 18:40

2 respostas

3

Como você adivinhou e @Rarst suspeitou, há uma verificação de paginação em wp_unique_post_slug() para tipos de postagens hierárquicas:

preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $slug )

que corresponderá a qualquer slug só numérico, opcionalmente precedido por "página". Para contornar isso, você poderia usar o filtro 'wp_unique_post_slug' , basicamente replicando o código original sem a verificação de paginação, por exemplo

add_filter( 'wp_unique_post_slug', function ( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    if ( $slug !== $original_slug && is_post_type_hierarchical( $post_type ) ) {

        global $wpdb, $wp_rewrite;

        $slug = $original_slug; // Undo any previous processing.

        // The following is just a copy & paste of the WP code without the pagination check.
        $feeds = $wp_rewrite->feeds;
        if ( ! is_array( $feeds ) )
            $feeds = array();

        if ( 'nav_menu_item' == $post_type )
            return $slug;

        /*
         * Page slugs must be unique within their own trees. Pages are in a separate
         * namespace than posts so page slugs are allowed to overlap post slugs.
         */
        $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( %s, 'attachment' ) AND ID != %d AND post_parent = %d LIMIT 1";
        $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID, $post_parent ) );

        /**
         * Filter whether the post slug would make a bad hierarchical post slug.
         *
         * @since 3.1.0
         *
         * @param bool   $bad_slug    Whether the post slug would be bad in a hierarchical post context.
         * @param string $slug        The post slug.
         * @param string $post_type   Post type.
         * @param int    $post_parent Post parent ID.
         */
        if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ) ) {
            $suffix = 2;
            do {
                $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
                $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID, $post_parent ) );
                $suffix++;
            } while ( $post_name_check );
            $slug = $alt_post_name;
        }
    }
    return $slug;
}, 10, 6 );
    
por bonger 08.05.2015 / 00:31
2

Seria mais correto dizer que os CPTs podem ser hierárquicos e não hierárquicos. Página e postagem são apenas exemplos respectivos de tal e, a propósito, como tipos de postagem nativos eles não são exatamente a mesma coisa que CPTs.

É claro que, quando você tem vários CPTs em um site, é importante que nem uma única combinação de slugs leve a um link permanente ambíguo , que pode se referir a mais de uma postagem.

Quando o WP gera post slugs wp_unique_post_slug() verifica e modifica o slug conforme necessário para conseguir isso.

É difícil adivinhar com certeza por que seu slug específico é modificado, sem ver o resto dos dados.

Em poucas palavras:

  • O WP considera que é insuficientemente exclusivo
  • existem filtros que permitem substituir esse comportamento
  • no entanto, a aplicação de slug não exclusivo pode explodir de maneiras interessantes
por Rarst 02.05.2015 / 23:26