web-dev-qa-db-ja.com

CPT&CTでベーススラグを削除、パーマリンクでCTを使用

私はかなり遠くまで来ました、しかしこれをうまく動かすことができません。

カスタム投稿タイプreviewとカスタム分類法brandから基本スラグを削除します。

最終結果は次のようなURLになります。https://example.org/Apple/iphone7

今私はこれを手に入れました:https://example.org/review/Apple/iphone7

私はかなり多くのことを読みました、そして結果と衝突の可能性について知っています、そしてWordPressはこれらの種類の書き換えを扱うように設計されていないことを私は知っています。しかし、私がやろうとしていることを達成する方法があるはずです。

http://www.markwarddesign.com/2014/02/remove-custom-post-type-slug-permalink/ のコードは削除するのに役立ちます基本的なスラッグだが、私は以下の機能を私のものと組み合わせることができない。 markwarddesign.comから関数を追加するとすぐに404が返されます。

私は、 カスタム投稿タイプに固有のカスタム分類法 で投稿されたソリューションを試しましたが、それでも基本スラグが含まれています。

私の設定を見てください。

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

任意の助けは大歓迎です。

1
f8m

私はあなたのコードをそのまま上記のようにコピーし、それをtwentysixteenテーマに貼り付け、そしてポストタイプの書き換えスラグをreview/%brand%から%brand%に変更しました。その結果、アーカイブとレビュー投稿の両方に、希望するURL構造を持ち、正常に表示されました。

今の悪いニュースは、分類法と投稿タイプに対して生成された書き換えルールが、投稿とページの書き換えルール全体に及ぶことです。投稿をリクエストすると、WordPressは投稿のスラッグに一致するブランド用語を見つけようとします。親ページ/子ページを要求すると、WordPressは子ページに一致するレビュー投稿をクエリしようとします。

良いニュースは、これを修正できることです。 WordPressでリクエストが解析されると、一致する可能性のあるすべてのクエリ変数が設定され、 requestフィルタ を通過して変更および変換されます。 。

このフィルタを覗くには、次のことを試してください。

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

その後、さまざまな種類のページにアクセスして、どのようなクエリ変数が生成されるのかを確認します。

基本的な投稿と子ページの表示を修正する簡単な例をまとめました。これは壊れているかもしれないすべてをカバーしていません。ページ付けされた投稿、添付ファイル、その他のものはテストしていません。他の投稿タイプがある場合、または投稿のパーマリンク構造が変更された場合も、これは変更される可能性があります。しかし、これはあなたに物事を動かすための出発点を与えるはずです。

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

興味のある人のために、これは私の問題に対する完全な解決策でした。これまでのところ、それはかなりうまくいきます。

私は%postname%をパーマリンク構造として使い、私のカスタム分類法は私のBrandとして、そしてカスタム投稿タイプは私のProductとして働いています。

example.org/some-brand/some-productで概要を表示することができますが私のURLはこのexample.org/some-brand/のように見えます。

すべてのページを編集可能にするためにAdvanced Custom Fields Proプラグインを使用しています。 wp323_get_template_file関数は@Miloが提案したものを実装しています、なぜならページやカスタムページテンプレートを持つページへのリクエストはすべてsingle.phpにリダイレクトされるからです。今すぐページがpage.phpによって表示され、カスタムページテンプレートがある場合は適切なテンプレートが表示されます。

すべてのProductBrandにリンクする必要があります。そうしないと、URLにブランドの代わりに/other/が含まれます。

これが誰かに役立つことを願って、これを達成するために私に数夜かけました。 @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