WordPress-Rewrite-Regeln für benutzerdefinierten Beitragstyp und Taxonomie

9

Ich habe festgestellt, dass dieser Ort in der Vergangenheit eine gute Informationsquelle war, indem ich viel nach den Problemen gegoogelt habe, auf die ich gestoßen bin. Meine Frage bezieht sich auf die ausführlichen Umschreiberegeln, die WordPress verwendet.

Ich habe einen benutzerdefinierten Beitragstyp namens " Projekt" eingerichtet und eine benutzerdefinierte Taxonomie namens " Projekte" registriert . Alles funktioniert hervorragend, bis auf die Optionen zum Umschreiben von Slugs, da diese zu Konflikten führen - höchstwahrscheinlich aufgrund der Umschreiberegeln.

Grundsätzlich ist dies die Struktur, die ich erreichen möchte:

  • example.com/work/%taxonomy%/%post_name%/ (für Beiträge)
  • example.com/work/%taxonomy%/ (Liste der Beiträge, die zu einem bestimmten Taxonomiebegriff gehören)
  • example.com/work/ (Gehen Sie zu page-work.php, die taxonomy.php enthält, um alle mit dieser Taxonomie verknüpften Beiträge aufzulisten.)

Hier ist der Code, den ich bisher habe, aber ich brauche Hilfe beim Schreiben der WP_Rewrite-Regeln, da dies das Bit ist, auf das ich ein bisschen ratlos bin.

$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => ''
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'hierarchical' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
    'query_var' => "project", // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type('project' , $args);

// Showcase Taxonomy
register_taxonomy('projects', array('project'), array(
    'public' => true,
    'hierarchical' => true,
    'label' => 'Project Categories', 
    'singular_label' => 'Project Category',
    'query_var' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
    )
);

Vielen Dank für deine Hilfe! :-)

matt_d_rat
quelle
@ChristopherDavis Danke, ich werde mir diese etwas genauer ansehen und sehen, wie es mir geht.
matt_d_rat
1
Ich denke, diese Frage kann durch Mischen von benutzerdefinierten Posttyp- und Taxonomie-Umschreibestrukturen beantwortet werden . Wenn Ihnen diese Frage nicht hilft, bearbeiten Sie diese Frage, um anzugeben, wie unterschiedlich sie ist.
Jan Fabry

Antworten:

1

Hoffe das kann dein Problem lösen

function my_custom_post_type() {
$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => '',
    'menu_name' => 'Projects' 
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
        'hierarchical' => false,
        'has_archive' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
        'query_var' => true, // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type( 'work' , $args );

}
function my_custom_taxonomies() {

    $labels = array(
        'name' => __( 'Taxonomy', 'taxonomy general name' ),
        'singular_name' => __( 'Taxonomy', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Taxonomy' ),
        'all_items' => __( 'All Taxonomy' ),
        'parent_item' => __( 'Parent Taxonomy' ),
        'parent_item_colon' => __( 'Parent Taxonomy:' ),
        'edit_item' => __( 'Edit Taxonomy' ), 
        'update_item' => __( 'Update Taxonomy' ),
        'add_new_item' => __( 'Add New Taxonomy' ),
        'new_item_name' => __( 'New Taxonomy Name' ),
        'menu_name' => __( 'Taxonomy' ),
    );  

    register_taxonomy( 'taxonomy', array('work'), array (
                    'labels' => $labels,
                    'hierarchical' =>false,
                    'show_ui' => true,
                    'rewrite' => array( 'slug' => 'work/taxonomy'),
                    'query_var' => true,
                    'show_in_nav_menus' => true,
                    'public' => true,
            ));
}

add_action('init', 'my_custom_post_type', 0);
add_action('init', 'my_custom_taxonomies', 10);

Was Sie erstellen müssen, ist archive-work.php (Ihr Post-Typ-Archiv) und taxonomy.php, mit denen Ihr benutzerdefiniertes Taxonomie-Archiv angezeigt wird.

Nichtsenkreativität
quelle
Vergessen Sie nicht, die "Taxonomie" für Ihren eigenen Taxonomienamen zu ändern. Verwenden Sie nicht denselben Wert wie Ihr post_type. Versuchen Sie, die Kategorie für den ersten Versuch zu verwenden. Arbeit / Kategorie, register_taxonomy ('Kategorie, Array (' Arbeit '), Array (......
Nichtsenkreativität
1

Ich hatte das gleiche Problem und nach vielen Schwierigkeiten kam ich zu dieser Lösung.
Fügen Sie dies einfach Ihrem Code hinzu

global $wp_rewrite;
$wp_rewrite->flush_rules(); 

function my_custom_post_type() {
    $labels = array(
        'name' => _x('Projects', 'post type general name'),
        'singular_name' => _x('Project', 'post type singular name'),
        'add_new' => _x('Add New', 'project item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => '',
        'menu_name' => 'Projects' 
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
            'hierarchical' => false,
            'has_archive' => true,
        'rewrite' => array('slug'=>'work', 'with_front'=>false),
        'show_ui' => true,
        '_builtin' => false, // It's a custom post type, not built in!
        'capability_type' => 'post',
            'query_var' => true, // This goes to the WP_Query schema
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
    );

    register_post_type( 'work' , $args );

    global $wp_rewrite;   
    $wp_rewrite->flush_rules();    // this should help 
}
Dipesh KC
quelle
5
$ wp_rewrite-> flush_rules () sollte nicht so oft ausgeführt werden, sondern nur bei Aktivierungs- oder Deaktivierungs-Hooks oder so sparsam wie möglich. Hier steht es so: codex.wordpress.org/Rewrite_API/flush_rules AUCH ist so ziemlich die gleiche Funktion wie diese: codex.wordpress.org/Function_Reference/flush_rewrite_rules
Jared
In einem anderen Punkt habe ich es so geschafft: pastebin.com/k7QvxKLi
Jared
@Jared Danke fürs Zeigen, aber ich konnte keinen Weg finden, dies zu begleiten, wenn dies in unser Thema integriert ist (dh nicht über das Plugin). Bitte vorschlagen.
Dipesh KC
Der Code würde functions.phpin diesem Fall eingehen. Der Code für ein Plugin und ein Thema ist genau der gleiche, der einzige Unterschied besteht in den Themen, in die es immer geht, functions.phpoder in einer Datei, die infunctions.php
Jared
2
Ich würde vorschlagen, den after_switch_themeHaken zu verwenden, er ist neu in 3.3 (IIRC).
Cristian
0

Eine ausführlichere Erklärung finden Sie in einem anderen Beitrag. Hier sind jedoch die grundlegenden Teile, die Sie hinzufügen müssen:

  1. Registrieren Sie Ihre Taxonomien und Cpt's wie Sie. Stellen Sie sicher, dass Ihr Umschreibungs-Slug für das Taxo "basename" und der Umschreib-Slug für das cpt "basename /% tax_name%" lautet.

  2. Sagen Sie WordPress, was mit "% tax_name%" wie folgt zu tun ist:

    function filter_post_type_link($link, $post)
    {
    if ($post->post_type != 'custom_post_type_name')
        return $link;
    
    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, link); // see custom function defined below
    }
    return $link;
    }
    add_filter('post_type_link', 'filter_post_type_link', 10, 2);
Jeff
quelle