Aggiunta di categorie al tipo di post personalizzato in permalink


22

So che la gente lo ha chiesto prima e si è spinto fino ad aggiungere il tipo di post personalizzato e riscrivere per permalink.

Il problema è che ho 340 categorie esistenti che vorrei continuare a utilizzare. Ero in grado di vedere / categoria / sottocategoria / postname

Ora ho la lumaca di customposttype / postname. La selezione della categoria non viene più visualizzata in permalink ... Non ho modificato l'impostazione del permalink in admin in qualcosa di diverso.

C'è qualcosa che mi manca o è necessario aggiungere a questo codice?

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
questa potrebbe essere una domanda sciocca, ma hai cancellato le tue riscritture?
Kristina Childs,

Di recente, ho riscontrato questo problema. Risolto! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare,

Risposte:


16

Ci sono 2 punti di attacco da coprire quando si aggiungono regole di riscrittura del tipo di post personalizzato:

Riscrivi le regole

Questo succede quando le regole di riscrittura vengono generate wp-includes/rewrite.phpin WP_Rewrite::rewrite_rules(). WordPress ti consente di filtrare le regole di riscrittura per elementi specifici come post, pagine e vari tipi di archivio. Dove vedi posttype_rewrite_rulesla posttypeparte dovrebbe essere il nome del tuo tipo di post personalizzato. In alternativa, puoi utilizzare il post_rewrite_rulesfiltro purché non annulli anche le regole postali standard.

Quindi abbiamo bisogno della funzione per generare effettivamente le regole di riscrittura:

// 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;
}

La cosa principale a cui prestare attenzione qui se decidete di giocare è il booleano 'Walk directories'. Genera regole di riscrittura per ogni segmento di un permastrotto e può causare disallineamenti delle regole di riscrittura. Quando viene richiesto un URL WordPress, l'array delle regole di riscrittura viene controllato dall'alto verso il basso. Non appena viene trovata una partita, caricherà tutto ciò che si è imbattuto, ad esempio se il tuo permastrotto ha una partita golosa, ad es. perché /%category%/%postname%/è presente nelle directory walk e verranno emesse regole di riscrittura per entrambi /%category%/%postname%/AND /%category%/che corrisponderanno a qualsiasi cosa. Se ciò accade troppo presto, sei fregato.

permalink

Questa è la funzione che analizza i permalink del tipo di post e converte un permastruct (es. '/% Year% /% monthnum% /% postname% /') in un URL reale.

La parte successiva è un semplice esempio di quella che sarebbe idealmente una versione della get_permalink()funzione trovata in wp-includes/link-template.php. Permalink post personalizzati sono generati da get_post_permalink()quale è una versione molto annacquata di get_permalink(). get_post_permalink()è filtrato da post_type_linkquindi lo stiamo usando per creare una permastruttura personalizzata.

// 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;
}

Come accennato, questo è un caso molto semplificato per la generazione di un set di regole di riscrittura personalizzato e permalink, e non è particolarmente flessibile ma dovrebbe essere sufficiente per iniziare.

Imbrogliare

Ho scritto un plug-in che ti consente di definire permastrotti per qualsiasi tipo di post personalizzato, ma come puoi usare %category%nella struttura del permalink per i post che il mio plug-in supporta %custom_taxonomy_name%per tutte le tassonomie personalizzate che hai anche dove si custom_taxonomy_nametrova il nome della tua tassonomia, ad es. %club%.

Funzionerà come ti aspetteresti con tassonomie gerarchiche / non gerarchiche.

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


1
il plugin è fantastico, ma potresti spiegare come risolvere il problema nella domanda senza il tuo plugin?
Eugene Manuilov,

Sono d'accordo che è fantastico che ci sia un plug-in per risolverlo (l'ho aggiunto ai segnalibri ed è la prima cosa che mi è venuta in mente su questa Q), ma la risposta trarrebbe beneficio da un breve riassunto di ciò che è il problema e di come il plugin lo ha vinto. :)
Rarst

@EugeneManuilov Va bene, scusa se è una risposta lunga. Questo è con me spogliandolo anche alle basi!
sanchothefat,

Sembra che il primo $permalink = home_url(...venga ignorato $permalink = user_trailingslashit(...e mai utilizzato. Oppure mi sfugge qualcosa? $post_linknon è nemmeno definito. Doveva essere $permalink = user_trailingslashit( $permalink, 'single' );?
Ian Dunn,

Buona cattura, dovrebbe essere $permalinknon $post_link. Saluti :)
sanchothefat,

1

Hai la soluzione!

Per avere permalink gerarchici per il tipo di posta personalizzato installare il plug-in Permalink del tipo di posta personalizzato ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Aggiorna il tipo di posta registrata. Ho il nome del tipo di post come centro assistenza

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

Ed ecco la tassonomia registrata

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

Questa linea fa funzionare il tuo permalink

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

puoi rimuovere %post_id% e mantenere/%help_centre_category%/%postname%/"

Non dimenticare di svuotare i permalink dal cruscotto.


+1 la soluzione più semplice è usare questo plugin: wordpress.org/plugins/custom-post-type-permalinks funziona perfettamente
Jules

Sì, ma questo è se si dispone di un singolo tipo di post personalizzato ma se si dispone di più tipi di post personalizzati in un unico tema, la soluzione è la soluzione sopra. Inoltre cambia anche la tua categoria di lumache come la tua lumaca di tipo post.
Varsha Dhadge,

1

Ho trovato una SOLUZIONE !!!

(Dopo infinite ricerche .. posso avere permalink CUSTOM POST TYPE come:
example.com/category/sub_category/my-post-name

qui il codice (in Functions.php o plugin):

//===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

Hai diversi errori con il tuo codice. Ho ripulito il tuo codice esistente:

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

Sostituisci il tuo codice con il codice sopra e vedi se funziona. Rispondi se hai ulteriori domande e cercherò di aiutarti.

MODIFICARE:

Ho notato che avevo lasciato fuori 'has_archive' => true.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.