Додавання категорій до користувацького типу публікації в постійній посилання


22

Я знаю, що люди вже це запитували і зайшли до того, як додали спеціальний тип публікації та переписали на постійне посилання.

Проблема в тому, що у мене є 340 існуючих категорій, які я хотів би продовжувати використовувати. Раніше я міг бачити / категорію / підкатегорію / ім’я

Тепер у мене є кулачок customposttype / postname. Вибір категорії більше не відображається в постійній посиланнях ... Я не змінив налаштування постійної посилання в адміністраторі на щось інше.

Щось мені не вистачає або потрібно додати до цього коду?

function jcj_club_post_types() {
    register_post_type( 'jcj_club', array(
        'labels' => array(
            'name' => __( 'Jazz Clubs' ),
            'singular_name' => __( 'Jazz Club' ),
            'add_new' => __( 'Add New' ),
            'add_new_item' => __( 'Add New Jazz Club' ),
            'edit' => __( 'Edit' ),
            'edit_item' => __( 'Edit Jazz Clubs' ),
            'new_item' => __( 'New Jazz Club' ),
            'view' => __( 'View Jazz Club' ),
            'view_item' => __( 'View Jazz Club' ),
            'search_items' => __( 'Search Jazz Clubs' ),
            'not_found' => __( 'No jazz clubs found' ),
            'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
            'parent' => __( 'Parent Jazz Club' ),
        ),
        'public' => true,
        'show_ui' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'menu_position' => 5,
        'query_var' => true,
        'supports' => array( 
            'title',
            'editor',
            'comments',
            'revisions',
            'trackbacks',
            'author',
            'excerpt',
            'thumbnail',
            'custom-fields',
        ),
        'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
        'taxonomies' => array( 'category','post_tag'),
        'can_export' => true,
    )
);

2
це може бути дурним питанням, але ви перечислили свої переписки?
Крістіна діти

Останнім часом я стикаюся з цим питанням. Вирішено! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare

Відповіді:


16

Існує 2 точки атаки, які потрібно охопити, коли ви додаєте власні правила перезапису типу публікації:

Перепишіть правила

Це відбувається, коли правила перезапису створюються wp-includes/rewrite.phpв WP_Rewrite::rewrite_rules(). WordPress дозволяє фільтрувати правила перезапису для конкретних елементів, таких як повідомлення, сторінки та різні типи архіву. Де ви бачите частина повинна бути ім'ям вашого призначеного для користувача поштового типу. Крім того, ви можете використовувати фільтр до тих пір, поки ви також не видалите стандартні правила публікації.posttype_rewrite_rulesposttypepost_rewrite_rules

Далі нам потрібна функція для фактичного створення правил перезапису:

// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );

function add_permastruct( $rules ) {
    global $wp_rewrite;

    // set your desired permalink structure here
    $struct = '/%category%/%year%/%monthnum%/%postname%/';

    // use the WP rewrite rule generating function
    $rules = $wp_rewrite->generate_rewrite_rules(
        $struct,       // the permalink structure
        EP_PERMALINK,  // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
        false,         // Paged: add rewrite rules for paging eg. for archives (not needed here)
        true,          // Feed: add rewrite rules for feed endpoints
        true,          // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
        false,         // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
        true           // Add custom endpoints
    );

    return $rules;
}

Тут головне, на що слід звернути увагу, якщо ви вирішили пограти, - булівський "Каталог прогулянок". Він генерує правила перезапису для кожного сегмента пермаструктури і може викликати невідповідність правил перезапису. Коли запитується URL-адреса WordPress, масив правил перезапису перевіряється зверху вниз. Як тільки відповідність буде знайдена, вона завантажує все, що натрапило, наприклад, якщо у вашої пермаструктури є жадібна відповідність, наприклад. для /%category%/%postname%/каталогів і прогулянок у ньому буде виведено переписати правила для обох /%category%/%postname%/І, /%category%/які будуть відповідати чому завгодно. Якщо це трапляється занадто рано, вас накрутили.

Постійні посилання

Це функція, яка аналізує постійні посилання типу публікації та перетворює permastruct (наприклад, '/% year% /% monthnum% /% postname% /') у фактичну URL-адресу.

Наступна частина - простий приклад того, що в ідеалі була б версія get_permalink()функції, знайдена в wp-includes/link-template.php. Користувальницькі постійні посилання створюються, за допомогою get_post_permalink()яких значно зменшується версія get_permalink(). get_post_permalink()фільтрується post_type_linkтим, що ми використовуємо це для створення власної пермаструктури.

// parse the generated links
add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 );

function custom_post_permalink( $permalink, $post, $leavename, $sample ) {

    // only do our stuff if we're using pretty permalinks
    // and if it's our target post type
    if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) {

        // remember our desired permalink structure here
        // we need to generate the equivalent with real data
        // to match the rewrite rules set up from before

        $struct = '/%category%/%year%/%monthnum%/%postname%/';

        $rewritecodes = array(
            '%category%',
            '%year%',
            '%monthnum%',
            '%postname%'
        );

        // setup data
        $terms = get_the_terms($post->ID, 'category');
        $unixtime = strtotime( $post->post_date );

        // this code is from get_permalink()
        $category = '';
        if ( strpos($permalink, '%category%') !== false ) {
            $cats = get_the_category($post->ID);
            if ( $cats ) {
                usort($cats, '_usort_terms_by_ID'); // order by ID
                $category = $cats[0]->slug;
                if ( $parent = $cats[0]->parent )
                    $category = get_category_parents($parent, false, '/', true) . $category;
            }
            // show default category in permalinks, without
            // having to assign it explicitly
            if ( empty($category) ) {
                $default_category = get_category( get_option( 'default_category' ) );
                $category = is_wp_error( $default_category ) ? '' : $default_category->slug;
            }
        }

        $replacements = array(
            $category,
            date( 'Y', $unixtime ),
            date( 'm', $unixtime ),
            $post->post_name
        );

        // finish off the permalink
        $permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) );
        $permalink = user_trailingslashit($permalink, 'single');
    }

    return $permalink;
}

Як уже згадувалося, це дуже спрощений випадок для створення користувальницького набору правил перезапису та постійних посилань, і він не є особливо гнучким, але його має бути достатньо для початку роботи.

Обман

Я написав плагін, який дозволяє визначати permastructs для будь-яких спеціальних типів публікацій, але, як ви можете використовувати %category%в структурі постійної посилання для публікацій, мій плагін підтримує %custom_taxonomy_name%будь-які власні таксономії, у яких ви також є, де custom_taxonomy_nameназивається ваша таксономія, наприклад. %club%.

Він буде працювати, як ви очікували, з ієрархічними / неієрархічними таксономіями.

http://wordpress.org/extend/plugins/wp-permastructure/


1
плагін чудовий, але ви могли б пояснити, як виправити проблему у питанні без вашого плагіна?
Євген Мануїлов

Я погоджуюся з тим, що це чудово, що є плагін для його вирішення (у мене це зроблено на закладках, і спочатку мені це прийшло в голову на цьому запитанні), але відповідь отримає користь від короткого резюме того, що є проблемою і як плагін її підкорив. :)
Рарст

@EugeneManuilov Добре, вибачте, це тривала відповідь. Це зі мною також знімаю це до основ!
sanchothefat

Схоже, що перший $permalink = home_url(...переосмислюється $permalink = user_trailingslashit(...і ніколи не використовується. Або я щось пропускаю? $post_linkнавіть не визначено. Це мало бути $permalink = user_trailingslashit( $permalink, 'single' );?
Ян Данн

Хороший улов, він повинен бути $permalinkНЕ $post_link. Ура :)
sanchothefat

1

Отримав рішення!

Щоб мати ієрархічні постійні посилання для користувальницького типу публікації, встановіть спеціальний плагін типу публікації Permalinks ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Оновити зареєстрований тип пошти. У мене є ім'я типу допису як довідковий центр

function help_centre_post_type(){
    register_post_type('helpcentre', array( 
        'labels'            =>  array(
            'name'          =>      __('Help Center'),
            'singular_name' =>      __('Help Center'),
            'all_items'     =>      __('View Posts'),
            'add_new'       =>      __('New Post'),
            'add_new_item'  =>      __('New Help Center'),
            'edit_item'     =>      __('Edit Help Center'),
            'view_item'     =>      __('View Help Center'),
            'search_items'  =>      __('Search Help Center'),
            'no_found'      =>      __('No Help Center Post Found'),
            'not_found_in_trash' => __('No Help Center Post in Trash')
                                ),
        'public'            =>  true,
        'publicly_queryable'=>  true,
        'show_ui'           =>  true, 
        'query_var'         =>  true,
        'show_in_nav_menus' =>  false,
        'capability_type'   =>  'page',
        'hierarchical'      =>  true,
        'rewrite'=> [
            'slug' => 'help-center',
            "with_front" => false
        ],
        "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
        'menu_position'     =>  21,
        'supports'          =>  array('title','editor', 'thumbnail'),
        'has_archive'       =>  true
    ));
    flush_rewrite_rules();
}
add_action('init', 'help_centre_post_type');

І тут зареєстрована систематика

function themes_taxonomy() {  
    register_taxonomy(  
        'help_centre_category',  
        'helpcentre',        
        array(
            'label' => __( 'Categories' ),
            'rewrite'=> [
                'slug' => 'help-center',
                "with_front" => false
            ],
            "cptp_permalink_structure" => "/%help_centre_category%/",
            'hierarchical'               => true,
            'public'                     => true,
            'show_ui'                    => true,
            'show_admin_column'          => true,
            'show_in_nav_menus'          => true,
            'query_var' => true
        ) 
    );  
}  
add_action( 'init', 'themes_taxonomy');

Ця лінія змушує вашу постійну посилання працювати

"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",

ви можете видалити %post_id%і можете зберегти/%help_centre_category%/%postname%/"

Не забудьте видалити постійні посилання з панелі приладів.


+1 найпростішим рішенням є просто використовувати цей плагін: wordpress.org/plugins/custom-post-type-permalinks прекрасно працює
Jules

Так, але це так, якщо у вас є один спеціальний тип публікації, але якщо у вас є кілька спеціальних типів публікації в одній темі, то вище це рішення. Крім того, він також змінює вашого категорію слизу так само, як ваш тип публікації.
Varsha Dhadge

1

Я знайшов РІШЕННЯ !!!

(Після нескінченних досліджень. Я можу мати постійні посилання CUSTOM POST TYPE на зразок:
example.com/category/sub_category/my-post-name

тут код (у function.php або плагіні):

//===STEP 1 (affect only these CUSTOM POST TYPES)
$GLOBALS['my_post_typesss__MLSS'] = array('my_product1','....');

//===STEP 2  (create desired PERMALINKS)
add_filter('post_type_link', 'my_func88888', 6, 4 );

function my_func88888( $post_link, $post, $sdsd){
    if (!empty($post->post_type) && in_array($post->post_type, $GLOBALS['my_post_typesss']) ) {  
        $SLUGG = $post->post_name;
        $post_cats = get_the_category($id);     
        if (!empty($post_cats[0])){ $target_CAT= $post_cats[0];
            while(!empty($target_CAT->slug)){
                $SLUGG =  $target_CAT->slug .'/'.$SLUGG; 
                if  (!empty($target_CAT->parent)) {$target_CAT = get_term( $target_CAT->parent, 'category');}   else {break;}
            }
            $post_link= get_option('home').'/'. urldecode($SLUGG);
        }
    }
    return  $post_link;
}

// STEP 3  (by default, while accessing:  "EXAMPLE.COM/category/postname"
// WP thinks, that a standard post is requested. So, we are adding CUSTOM POST
// TYPE into that query.
add_action('pre_get_posts', 'my_func4444',  12); 

function my_func4444($q){     
    if ($q->is_main_query() && !is_admin() && $q->is_single){
        $q->set( 'post_type',  array_merge(array('post'), $GLOBALS['my_post_typesss'] )   );
    }
    return $q;
}

-2

У вас є кілька помилок із кодом. Я очистив ваш існуючий код:

<?php
function jcj_club_post_types() {
  $labels = array(
    'name' => __( 'Jazz Clubs' ),
    'singular_name' => __( 'Jazz Club' ),
    'add_new' => __( 'Add New' ),
    'add_new_item' => __( 'Add New Jazz Club' ),
    'edit' => __( 'Edit' ),
    'edit_item' => __( 'Edit Jazz Clubs' ),
    'new_item' => __( 'New Jazz Club' ),
    'view' => __( 'View Jazz Club' ),
    'view_item' => __( 'View Jazz Club' ),
    'search_items' => __( 'Search Jazz Clubs' ),
    'not_found' => __( 'No jazz clubs found' ),
    'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
    'parent' => __( 'Parent Jazz Club' ),
    );
  $args = array(
    'public' => true,
    'show_ui' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'menu_position' => 5,
    'query_var' => true,
    'supports' => array( 'title','editor','comments','revisions','trackbacks','author','excerpt','thumbnail','custom-fields' ),
    'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
    'has_archive' => true
    );
  register_post_type( 'jcj_club', $args );
  }
add_action( 'init','jcj_club_post_types' );
?>

Замініть свій код вищенаведеним кодом і подивіться, чи працює він. Відповідайте, якщо у вас є додаткові питання, і я спробую допомогти.

Редагувати:

Я помітив, що я пройшов 'has_archive' => true.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.