Slug numérico en publicación de niños

4

Entiendo que hay 2 tipos diferentes cuando se trata de un tipo de publicación personalizada: -página -enviar.

Donde página admite páginas secundarias, y publicación no.

Sin embargo, cuando trato de hacer una página secundaria con solo números en su babosa, wordpress pone -2 detrás. Ejemplo:

/ posttype / parent / 10-2 /

en lugar de lo que hubiera querido:

/ posttype / parent / 10 /

¿Por qué sucede esto y cómo puedo resolverlo? He buscado durante horas, pero parece que no puedo encontrar una solución, aparte de que es quizás una limitación en Wordpress, no a un conflicto con su fecha en el sistema de enlace permanente. No estoy usando este sistema, pero ¿podría ser cierto?

EDITAR, más información: No hay publicaciones que puedan entrar en conflicto con mi permalink. Definitivamente no se toma el enlace permanente.

Obtengo este comportamiento con una instalación completamente nueva de wordpress, y solo 1 tipo de publicación personalizada. Las únicas publicaciones en la base de datos de wordpress son 'padre' y '02'. Donde '02' se convierte en '02 -2 '.

Me preguntaba si tal vez la paginación / slug / page / 02 fue tal vez la razón por la que no se aceptaron slugs numéricos.

Es importante tener en cuenta que solo obtengo esto con barras numéricas, / parent / child / no es un problema.

He visto algo acerca de anular los filtros, pero ¿no ocultará eso simplemente el problema? Prefiero resolverlo.

El código que utilizo para registrar mi tipo de publicación personalizada:

    $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 );

Según tengo entendido, el 'tipo_capacidad' debe configurarse en página y no en publicación para permitir una jerarquía, donde configurarlo para 'publicar' no lo permite.

    
pregunta Sleuteltje 02.05.2015 - 18:40

2 respuestas

3

Como habrás adivinado y @Rarst sospechó, hay un control de paginación en wp_unique_post_slug() para los tipos de publicaciones jerárquicas:

preg_match( "@^($wp_rewrite->pagination_base)?\[email protected]", $slug )

que coincidirá con cualquier barra numérica, opcionalmente precedida por "página". Para evitar esto, puede usar el filtro 'wp_unique_post_slug' , básicamente replicando el código original sin la comprobación de paginación, por ejemplo,

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 );
    
respondido por el bonger 08.05.2015 - 00:31
2

Sería más correcto decir que los CPT pueden ser jerárquicos y no jerárquicos. Página y publicación son solo ejemplos respectivos de los mismos, y por cierto, como los tipos de publicaciones nativas no son exactamente lo mismo que los CPT.

Claramente, cuando tienes múltiples CPT en un sitio, es importante que ni una sola combinación de babosas conduzca al enlace permanente ambiguo , que puede referirse a más de una publicación.

Cuando WP genera slugs posteriores, wp_unique_post_slug() comprueba y modifica el slug según sea necesario para lograrlo.

Es difícil adivinar con certeza por qué se modifica tu babosa específica, sin ver el resto de los datos.

En pocas palabras:

  • WP considera que no es lo suficientemente único
  • hay filtros que le permiten anular este comportamiento
  • sin embargo, la aplicación de un slug no único podría explotar de formas interesantes
respondido por el Rarst 02.05.2015 - 23:26

Lea otras preguntas en las etiquetas