web-dev-qa-db-fra.com

Enlevez le bouchon de base dans le CPT et le CT, utilisez le CT dans le permalien

Je suis allé assez loin, mais je n'arrive pas à faire en sorte que cela fonctionne.

Je souhaite supprimer le slug de base de mon type de message personnalisé review et de ma taxonomie personnalisée brand.

Le résultat final devrait être une URL comme celle-ci: https://example.org/Apple/iphone7.

En ce moment, j'ai ceci: https://example.org/review/Apple/iphone7.

J'ai beaucoup lu et je connais les conséquences et les conflits éventuels, et WordPress n'est pas conçu pour gérer ce type de réécriture. Mais il doit y avoir un moyen de réaliser ce que j'essaie de faire.

Le code à l'adresse http://www.markwarddesign.com/2014/02/remove-custom-post-type-slug-permalink/ fonctionne pour supprimer la limace de base, mais je ne parviens pas à combiner les fonctions avec les miennes ci-dessous. Dès que j'ajoute la fonction de markwarddesign.com, il en résulte un 404.

J'ai essayé la solution publiée à Taxonomie personnalisée propre à un type de publication personnalisée , mais elle contient toujours le slug de base.

S'il vous plaît jeter un oeil à ma configuration.

function brand_permalink($permalink, $post_id, $leavename) {
    if (strpos($permalink, '%brand%') === FALSE) return $permalink;
        // Get post
        $post = get_post($post_id);
        if (!$post) return $permalink;

        // Get taxonomy terms
        $terms = wp_get_object_terms($post->ID, 'brand');
        if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
            $taxonomy_slug = $terms[0]->slug;
        else $taxonomy_slug = 'other';

    return str_replace('%brand%', $taxonomy_slug, $permalink);
}
add_filter('post_link', 'brand_permalink', 1, 3);
add_filter('post_type_link', 'brand_permalink', 1, 3);

/**
 * Code below is from https://wordpress.stackexchange.com/questions/57493/custom-taxonomy-specific-to-a-custom-post-type
 * A custom taxonomy is created and linked to CPT 'review'.
 * The goal is to create permalinks containing the taxonomy + CPT post name, e.g. /some-brand/xyz-review/
 */
function custom_brand_taxonomy() {
    register_taxonomy(
        'brand',  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces). 
        'review',        //post type name
        array(  
            'hierarchical' => true,  
            'label' => 'Brand',  //Display name
            'query_var' => true,
            'rewrite' => array(
                'slug' => '', // This controls the base slug that will display before each term
                'with_front' => false // Don't display the category base before 
            )
        )  
    );  
}  
add_action( 'init', 'custom_brand_taxonomy');

/**
 * Creating a function to create our CPT
 *
 */
function xyz_custom_post_types() {

    // Set options for Custom Post Type REVIEW
    $review_args = array(
        'label'               => __( 'review', 'mythemexyz' ),
        'description'         => __( 'Descrption review bla bla', 'mythemexyz' ),
        'labels'              => array(
                                'name'                => _x( 'reviewe', 'Post Type General Name', 'mythemexyz' ),
                                'singular_name'       => _x( 'review', 'Post Type Singular Name', 'mythemexyz' ),
                                'menu_name'           => __( 'reviewe', 'mythemexyz' ),
                                'parent_item_colon'   => __( 'Parent review', 'mythemexyz' ),
                                'all_items'           => __( 'Alle reviewe', 'mythemexyz' ),
                                'view_item'           => __( 'review ansehen', 'mythemexyz' ),
                                'add_new_item'        => __( 'review erstellen', 'mythemexyz' ),
                                'add_new'             => __( 'Erstellen', 'mythemexyz' ),
                                'edit_item'           => __( 'review bearbeiten', 'mythemexyz' ),
                                'update_item'         => __( 'review aktualisieren', 'mythemexyz' ),
                                'search_items'        => __( 'review suchen', 'mythemexyz' ),
                                'not_found'           => __( 'Nicht gefunden', 'mythemexyz' ),
                                'not_found_in_trash'  => __( 'Nicht in Papierkorb gefunden', 'mythemexyz' ),
                                ),
        // Features this CPT supports in Post Editor
        'supports'            => array( 'title', 'editor', 'revisions', 'custom-fields', 'page-attributes' ),
        /* A hierarchical CPT is like Pages and can have
        * Parent and child items. A non-hierarchical CPT
        * is like Posts.
        */  
        'hierarchical'        => false,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'show_in_nav_menus'   => true,
        'show_in_admin_bar'   => true,
        'menu_position'       => 99,
        'can_export'          => true,
        'rewrite'             => array( 'slug' => 'review/%brand%', 'with_front' => false ),
        'has_archive'         => 'review',
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'capability_type'     => 'page',
    );

    // Registering your Custom Post Type
    register_post_type( 'review', $review_args );

}

/* Hook into the 'init' action so that the function
 * Containing our post type registration is not 
 * unnecessarily executed. 
 */
add_action( 'init', 'xyz_custom_post_types', 0 );

Toute aide est appréciée.

1
f8m

J'ai copié votre code tel quel ci-dessus, je l'ai collé dans le thème des vingt-six ans et modifié simplement le slug de réécriture de type de publication de review/%brand% à %brand%. Cela a abouti à la fois au terme archives et aux publications de révision ayant votre structure d'URL souhaitée et en affichant avec succès.

La mauvaise nouvelle est que les règles de réécriture générées pour la taxonomie et le type de message sont omniprésentes dans les règles de réécriture de publication et de page. WordPress essaie de trouver un terme de marque correspondant à votre message. Une demande de résultats de page parent/page enfant dans WordPress essayant d'interroger une publication de révision correspondant à la page enfant.

La bonne nouvelle est que nous pouvons résoudre ce problème. Lorsqu'une requête est analysée par WordPress, tous les vars de requête potentiellement correspondants sont renseignés et transmis via le filtre request où nous pouvons les modifier et les transformer. .

Pour jeter un coup d'œil dans ce filtre, essayez:

function test_request( $request ){
    echo '<pre>';
    print_r($request);
    echo '</pre>';
}
add_filter( 'request', 'test_request' );

Ensuite, visitez différents types de pages et voyez quelles vars de requête sont remplies.

J'ai piraté ensemble un exemple rapide qui corrige l'affichage de base de publication et de page enfant. Cela ne couvre pas tout ce qui pourrait être cassé. Je n'ai pas testé les publications paginées, les pièces jointes, etc. Cela peut également changer si vous avez d'autres types de publication ou si votre structure de permalien de publication a été modifiée. Mais cela devrait vous donner un point de départ pour faire avancer les choses.

function wpd_fix_requests( $request ){

    // if it's a brand term request
    // see if a brand term exists by this name with get_term_by
    // if not, reset the query to a post or page with name
    if( array_key_exists( 'brand' , $request )
        && ! array_key_exists( 'post_type' , $request )
        && ! get_term_by( 'slug', $request['brand'], 'brand' ) ){
            $request['name'] = $request['brand'];
            $request['post_type'] = array( 'post', 'page' );
            unset( $request['brand'] );
    }

    // if this is a review request
    // add page to post type in case it's a child page
    if( array_key_exists( 'review', $request ) ){
        $request['post_type'] = array( 'review', 'page' );
    }

    // return request vars
    return $request;
}
add_filter( 'request', 'wpd_fix_requests' );
1
Milo

Pour toute personne intéressée, c'était la solution complète à mon problème. Jusqu'à présent, cela fonctionne assez bien.

J'utilise %postname% comme structure de lien permanent et ma taxonomie personnalisée fonctionne comme mon Brand et le type de message personnalisé fonctionne comme mon Product.

Donc, mon URL ressemble à ceci example.org/some-brand/some-product alors que je peux afficher une vue d'ensemble sur example.org/some-brand/.

J'utilise le plugin Advanced Custom Fields Pro pour rendre toutes mes pages modifiables. La fonction wp323_get_template_file implémente ce que @Milo a suggéré, puisque toutes les demandes adressées à des pages ou à des pages avec un modèle de page personnalisé ont été redirigées vers single.php. Les pages sont maintenant affichées par page.php et s’il existe un modèle de page personnalisé, le modèle approprié est affiché.

Chaque Product doit être lié à un Brand, sinon l'URL contiendra /other/ au lieu de la marque.

J'espère que cela aide quelqu'un, cela m'a pris quelques nuits pour accomplir cela. Merci à @Milo.

 <?php

 function wpd_fix_requests( $request ){
     // Written by @Milo: https://wordpress.stackexchange.com/questions/215987/remove-base-slug-in-cpt-ct-use-ct-in-permalink
     // if it's a brand term request
     // see if a brand term exists by this name with get_term_by
     // if not, reset the query to a post or page with name
     if( array_key_exists( 'brand' , $request )
         && ! array_key_exists( 'post_type' , $request )
         && ! get_term_by( 'slug', $request['brand'], 'brand' ) ){
             $request['name'] = $request['brand'];
             $request['post_type'] = array( 'post', 'page' );
             unset( $request['brand'] );
     }

     // if this is a review request
     // add page to post type in case it's a child page
     if( array_key_exists( 'review', $request ) ){
         $request['post_type'] = array( 'review', 'page' );
     }

     // return request vars
     return $request;
 }
 add_filter( 'request', 'wpd_fix_requests' );

 function brand_permalink($permalink, $post_id, $leavename) {
     if (strpos($permalink, '%brand%') === FALSE) return $permalink;
         // Get post
         $post = get_post($post_id);
         if (!$post) return $permalink;

         // Get taxonomy terms
         $terms = wp_get_object_terms($post->ID, 'brand');
         if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
             $taxonomy_slug = $terms[0]->slug;
         else $taxonomy_slug = 'other';

     return str_replace('%brand%', $taxonomy_slug, $permalink);
 }
 add_filter('post_link', 'brand_permalink', 1, 3);
 add_filter('post_type_link', 'brand_permalink', 1, 3);

 /**
  * Code below is from https://wordpress.stackexchange.com/questions/57493/custom-taxonomy-specific-to-a-custom-post-type
  * A custom taxonomy is created and linked to CPT 'review'.
  * The goal is to create permalinks containing the taxonomy + CPT post name, e.g. /some-brand/xyz-review/
  */
 function custom_brand_taxonomy() {
     register_taxonomy(
         'brand',  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces). 
         'review',        //post type name
         array(  
             'hierarchical' => true,  
             'label' => 'Brand',  //Display name
             'query_var' => true,
             'rewrite' => array(
                 'slug' => '/', // This controls the base slug that will display before each term
                 'with_front' => false // Don't display the category base before 
             )
         )  
     );  
 }  
 add_action( 'init', 'custom_brand_taxonomy');

 /**
  * Creating a function to create our CPT
  *
  */
 function xyz_custom_post_types() {

     // Set options for Custom Post Type REVIEW
     $review_args = array(
         'label'               => __( 'review', 'mythemexyz' ),
         'description'         => __( 'Descrption review bla bla', 'mythemexyz' ),
         'labels'              => array(
                                 'name'                => _x( 'reviewe', 'Post Type General Name', 'mythemexyz' ),
                                 'singular_name'       => _x( 'review', 'Post Type Singular Name', 'mythemexyz' ),
                                 'menu_name'           => __( 'reviewe', 'mythemexyz' ),
                                 'parent_item_colon'   => __( 'Parent review', 'mythemexyz' ),
                                 'all_items'           => __( 'Alle reviewe', 'mythemexyz' ),
                                 'view_item'           => __( 'review ansehen', 'mythemexyz' ),
                                 'add_new_item'        => __( 'review erstellen', 'mythemexyz' ),
                                 'add_new'             => __( 'Erstellen', 'mythemexyz' ),
                                 'edit_item'           => __( 'review bearbeiten', 'mythemexyz' ),
                                 'update_item'         => __( 'review aktualisieren', 'mythemexyz' ),
                                 'search_items'        => __( 'review suchen', 'mythemexyz' ),
                                 'not_found'           => __( 'Nicht gefunden', 'mythemexyz' ),
                                 'not_found_in_trash'  => __( 'Nicht in Papierkorb gefunden', 'mythemexyz' ),
                                 ),
         // Features this CPT supports in Post Editor
         'supports'            => array( 'title', 'editor', 'revisions', 'custom-fields', 'page-attributes' ),
         /* A hierarchical CPT is like Pages and can have
         * Parent and child items. A non-hierarchical CPT
         * is like Posts.
         */  
         'hierarchical'        => false,
         'public'              => true,
         'show_ui'             => true,
         'show_in_menu'        => true,
         'show_in_nav_menus'   => true,
         'show_in_admin_bar'   => true,
         'menu_position'       => 99,
         'can_export'          => true,
         'rewrite'             => array( 'slug' => '%brand%', 'with_front' => false ),
         'has_archive'         => 'review',
         'exclude_from_search' => false,
         'publicly_queryable'  => true,
         'capability_type'     => 'page',
     );

     // Registering your Custom Post Type
     register_post_type( 'review', $review_args );

 }

 /* Hook into the 'init' action so that the function
  * Containing our post type registration is not 
  * unnecessarily executed. 
  */
 add_action( 'init', 'xyz_custom_post_types', 0 );

 /**
  * Use single_template filter to properply redirect to page.php and custom page templates
  */
 function wp323_get_template_file($single_template) {
      global $post;

      $page_custom_template = get_post_meta( $post->ID, '_wp_page_template', true );

      if ($post->post_type == 'page') {
        if($page_custom_template != 'default') {
            $single_template = dirname( __FILE__ ) . '/' . $page_custom_template;
        }
        else {
            $single_template = dirname( __FILE__ ) . '/page.php';
        }

      }
      return $single_template;
 }
 add_filter( 'single_template', 'wp323_get_template_file' );
1
f8m