it-swarm.com.de

Benutzerdefinierter Beitragstyp/Taxonomie-Slug/Beitragstitel mit Beitragstyp-Archiv

Ich habe Plugins ausprobiert, Stapel durchgelesen und Stunden damit verbracht, und ich kann einfach keinen Weg finden, um das zu erreichen, was ich will.

Ich kann die folgende Permalink-Struktur erreichen:

custom-post-type/taxonomy-term/post-title

zum Beispiel our-work/interactive/some-project-title

das ermöglicht our-work/interactive auch die korrekte Anzeige aller unserer Arbeitsposten mit dem Taxonomiebegriff interaktiv, aber ich kann die Archivseite our-work nicht mehr zum Laufen bringen. Hier ist der Code, den ich verwende, um das oben Genannte zu erreichen

function my_custom_post_work() {
    $labels = array(
        'name'               => _x( 'Work', 'post type general name' ),
        'singular_name'      => _x( 'Work', 'post type singular name' ),
        'add_new'            => _x( 'Add New', 'book' ),
        'add_new_item'       => __( 'Add New Work' ),
        'edit_item'          => __( 'Edit Work' ),
        'new_item'           => __( 'New Work' ),
        'all_items'          => __( 'All Work' ),
        'view_item'          => __( 'View Work' ),
        'search_items'       => __( 'Search Work' ),
        'not_found'          => __( 'No work found' ),
        'not_found_in_trash' => __( 'No work found in the Trash' ), 
        'parent_item_colon'  => '',
        'menu_name'          => 'Our Work'
    );
    $args = array(
        'labels'        => $labels,
        'description'   => 'Holds our works and work specific data',
        'public'        => true,
        'menu_position' => 5,
        'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
        'has_archive'   => true,
        'rewrite'       => array( 'slug' => 'our-work/%work_category%')
    );
    register_post_type( 'work', $args );    
}
add_action( 'init', 'my_custom_post_work' );

function mav_taxonomies_work() {
    $labels = array(
        'name'              => _x( 'Work Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Work Category', 'taxonomy singular name' ),
        'search_items'      => __( 'Search Work Categories' ),
        'all_items'         => __( 'All Work Categories' ),
        'parent_item'       => __( 'Parent Work Category' ),
        'parent_item_colon' => __( 'Parent Work Category:' ),
        'edit_item'         => __( 'Edit Work Category' ), 
        'update_item'       => __( 'Update Work Category' ),
        'add_new_item'      => __( 'Add New Work Category' ),
        'new_item_name'     => __( 'New Work Category' ),
        'menu_name'         => __( 'Work Categories' ),
    );
    $args = array(
        'labels' => $labels,
        'hierarchical' => true,
        'has_archive'   => true,
    );
    register_taxonomy( 'work_category', 'work', $args );
}
add_action( 'init', 'mav_taxonomies_work', 0 );

function filter_post_type_link($link, $post) {
    if ($post->post_type != 'work')
        return $link;

    if ($cats = get_the_terms($post->ID, 'work_category'))
        $link = str_replace('%work_category%', array_pop($cats)->slug, $link);

    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Idealerweise möchte ich, dass Folgendes funktioniert:

  • /our-work/ => zeige alle benutzerdefinierten Beiträge an
  • /our-work/taxonomy-term/ => zeige alle Beiträge mit diesem ausgewählten Begriff an
  • /our-work/taxonomy-term/post-title/ => der Permalink, wenn ein bestimmter Beitrag angeklickt wird.

Gibt es einen besseren Weg, dies zu tun?

2
Joshua Richards

Ersetzen Sie Ihren Code durch den folgenden.
Ich habe einige Änderungen an der Rückruffunktion des post_type_link-Filters vorgenommen.

function my_custom_post_work() {
    $labels = array(
        'name'               => _x( 'Work', 'post type general name' ),
        'singular_name'      => _x( 'Work', 'post type singular name' ),
        'add_new'            => _x( 'Add New', 'book' ),
        'add_new_item'       => __( 'Add New Work' ),
        'edit_item'          => __( 'Edit Work' ),
        'new_item'           => __( 'New Work' ),
        'all_items'          => __( 'All Work' ),
        'view_item'          => __( 'View Work' ),
        'search_items'       => __( 'Search Work' ),
        'not_found'          => __( 'No work found' ),
        'not_found_in_trash' => __( 'No work found in the Trash' ), 
        'parent_item_colon'  => '',
        'menu_name'          => 'Our Work'
    );
$args = array(
        'labels'        => $labels,
        'description'   => 'Holds our works and work specific data',
        'public'        => true,
        'menu_position' => 5,
        'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
        'has_archive'   => true,
        'rewrite'       => array( 'slug' => 'our-work/%work_category%')
    );
    register_post_type( 'work', $args );    
}
add_action( 'init', 'my_custom_post_work' );

function mav_taxonomies_work() {
    $labels = array(
        'name'              => _x( 'Work Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Work Category', 'taxonomy singular name' ),
        'search_items'      => __( 'Search Work Categories' ),
        'all_items'         => __( 'All Work Categories' ),
        'parent_item'       => __( 'Parent Work Category' ),
        'parent_item_colon' => __( 'Parent Work Category:' ),
        'edit_item'         => __( 'Edit Work Category' ), 
        'update_item'       => __( 'Update Work Category' ),
        'add_new_item'      => __( 'Add New Work Category' ),
        'new_item_name'     => __( 'New Work Category' ),
        'menu_name'         => __( 'Work Categories' ),
    );
    $args = array(
        'labels' => $labels,
        'hierarchical' => true,
        'has_archive'   => true,
    );
    register_taxonomy( 'work_category', 'work', $args );
}
add_action( 'init', 'mav_taxonomies_work', 0 );
add_filter('post_type_link', 'filter_post_type_link', 10, 2);    
function filter_post_type_link( $post_link, $id = 0, $leavename = FALSE ) {
    if ( strpos('%work_category%', $post_link) === 'FALSE' ) {
      return $post_link;
    }
    $post = get_post($id);
    if ( !is_object($post) || $post->post_type != 'work' ) {
      return $post_link;
    }
    $terms = wp_get_object_terms($post->ID, 'work_category');
    if ( !$terms ) {
      return str_replace('our-work/%work_category%/', '', $post_link);
    }
    return str_replace('%work_category%', $terms[0]->slug, $post_link);
}

Außerdem müssen Sie Umschreiberegeln für Ihren benutzerdefinierten Beitragstyp schreiben, damit die vorgeschlagene URI-Struktur funktioniert.

Fügen Sie den folgenden Code zur functions.php-Datei Ihres Themas hinzu:

add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
add_action( 'wp_loaded','my_flush_rules' );    
function my_flush_rules(){
    $rules = get_option( 'rewrite_rules' );
            global $wp_rewrite;
    $wp_rewrite->flush_rules();
} 

// Adding a new rule    
function my_insert_rewrite_rules( $rules )    
{
    $newrules = array();
    $newrules['our-work/?$'] = 'index.php?post_type=work';
    $newrules['our-work/page/?([0-9]{1,})/?$'] = 'index.php?post_type=work&paged=$matches[1]';
    $newrules['our-work/(.+?)/page/?([0-9]{1,})/?$'] = 'index.php?post_type=work&work_category=$matches[1]&paged=$matches[2]';
    //print_r($rules);
    return $newrules + $rules;
}
3
dipali