web-dev-qa-db-fra.com

Limace numérique sur le post de l'enfant

Je comprends qu’il existe 2 types différents en ce qui concerne un type de message personnalisé: -page -post.

Where page prend en charge les pages enfants et post ne le fait pas.

Cependant, quand j'essaie de faire une page enfant avec seulement des nombres dans son slug, wordpress met -2 derrière. Exemple:

/ posttype/parent/10-2 /

au lieu de ce que j'aurais voulu:

/ posttype/parent/10 /

Pourquoi est-ce cela et comment puis-je le résoudre? J'ai cherché pendant des heures, mais je n'arrive pas à trouver de solution. Sinon, il s'agit peut-être d'une limitation dans Wordpress, mais d'un conflit avec son système de permalien de date. Je n'utilise pas ce système, mais est-ce que cela pourrait être vrai?

EDIT, quelques informations supplémentaires: Il n’existe aucun message pouvant entrer en conflit avec mon permalien. Le permalien n'est définitivement pas pris.

J'obtiens ce comportement avec une nouvelle installation de wordpress et un seul type de message personnalisé. Les seuls articles de la base de données wordpress sont 'parent' et '02'. Où '02' se transforme en '02 -2 '.

Je me demandais si la pagination/slug/page/02 était peut-être la raison pour laquelle les slug numériques n'étaient pas acceptées?

Il est important de noter que je ne l’obtiens qu’avec des slugs numériques,/parent/enfant/n’est pas un problème.

J'ai vu quelque chose à propos de la suppression des filtres, mais cela ne va-t-il pas simplement cacher le problème? Je préfère le résoudre.

Le code que j'utilise pour enregistrer mon type de message personnalisé:

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

Si je comprends bien, le 'type de capacité' doit être réglé sur page et non post pour permettre une hiérarchisation, alors que le paramétrer sur 'post' ne le permet pas.

5
Sleuteltje

Comme vous l'avez deviné et suspecté par @Rarst, il existe une vérification de la pagination dans wp_unique_post_slug() pour les types de publication hiérarchiques:

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

qui correspondra à n’importe quel slug numérique, éventuellement précédé de "page". Pour contourner ce problème, vous pouvez utiliser le filtre 'wp_unique_post_slug', qui consiste essentiellement à reproduire le code d'origine sans vérification de la pagination, par exemple:

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 );
3
bonger

Il serait plus correct de dire que les TPC peuvent être hiérarchiques et non hiérarchiques. Les pages et les publications ne sont que des exemples respectifs, et les types de publication natifs ne sont pas tout à fait la même chose que les CPT.

Clairement, lorsque vous avez plusieurs CPT sur un site, il est important qu'aucune combinaison de slugs ne conduise àambigu/permalink, ce qui pourrait faire référence à plus d'une publication.

Quand WP génère des posts slugs wp_unique_post_slug() vérifie et modifie slug si nécessaire pour atteindre cet objectif.

Il est difficile de deviner avec certitude pourquoi votre slug spécifique est modifié sans voir le reste des données.

En un mot:

  • WP le considère insuffisamment unique
  • il existe des filtres qui vous permettent de remplacer ce comportement
  • toutefois, l'application de slug non uniquemightexplose de manière intéressante
2
Rarst