Datumsarchive für benutzerdefinierten Posttyp

Ich habe viele Fragen / Beiträge dazu gesehen, aber ich muss noch eine vernünftige Lösung finden. Im Grunde versuche ich zu tun, was wp_get_archives tut, aber für einen benutzerdefinierten Beitragstyp (persönlich bin ich mir nicht sicher, warum wp_get_archives keine benutzerdefinierten Beitragstypen unterstützt!).

Der Code, den ich momentan verwende, ist wie folgt

functionen.php

 function Cpt_getarchives_where_filter( $where , $r ) { $post_type = 'events'; return str_replace( "post_type = 'post'" , "post_type = '$post_type'" , $where ); } 

sidebar-events.php

 add_filter( 'getarchives_where' , 'Cpt_getarchives_where_filter' , 10 , 2 ); wp_get_archives(); remove_filter('getarchives_where' , 'Cpt_getarchives_where_filter' , 10 ); 

Dieser Code zeigt die Daten an (zB April 2014, März 2014) usw., was großartig ist, aber das Klicken auf die Links geht einfach zu einem 404. Die URL, die auf jedem Datumslink erstellt wird, ist / 2014/04 /, sollte aber etwas sein like / Ereignisse / 2014/04 /.

Gibt es eine Möglichkeit, “Ereignisse” in die URL einzufügen, so dass die Vorlage archive-events.php verwendet werden kann, und gibt es einen Grund, warum die Links derzeit einen 404 erzeugen?

Vielen Dank für jede Hilfe

Solutions Collecting From Web of "Datumsarchive für benutzerdefinierten Posttyp"

Was Sie wollen, können Sie auch tun 'month_link' für monatliche Archive, 'year_link' für jährliche Archive und 'day_link' für tägliche Archive 'day_link' .

Sie können auch eine function schreiben, die wp_get_archives für die Arbeit mit CPTs erweitert und Filter zu 'getarchives_where' und zum Archivlink hinzufügt.

 function wp_get_cpt_archives( $cpt = 'post', $args = array() ) { // if cpt is post run the core get archives if ( $cpt === 'post' ) return wp_get_archives($args); // if cpt doesn't exists return error if ( ! post_type_exists($cpt) ) return new WP_Error('invalid-post-type'); $pto = get_post_type_object($cpt); // if cpt doesn't have archive return error if ( ! $pto = get_post_type_object( $cpt ) ) return false; $types = array('monthly' => 'month', 'daily' => 'day', 'yearly' => 'year'); $type = isset( $args['type'] ) ? $args['type'] : 'monthly'; if ( ! array_key_exists($type, $types) ) { // supporting only 'monthly', 'daily' and 'yearly' archives return FALSE; } $done_where = $done_link = FALSE; // filter where add_filter( 'getarchives_where' , function( $where ) use (&$done_where, $cpt) { if ( $done_where ) return $where; return str_replace( "post_type = 'post'" , "post_type = '{$cpt}'" , $where ); }); // filter link add_filter( "{$types[$type]}_link", function( $url ) use (&$done_link, $pto, $cpt) { if ( $done_link ) return $url; // if no pretty permalink add post_type url var // if ( get_option( 'permalink_structure' ) || ! $pto->rewrite ) { if ( ! get_option( 'permalink_structure' ) || ! $pto->rewrite ) { return add_query_arg( array( 'post_type' => $cpt ), $url ); } else { // pretty permalink global $wp_rewrite; $slug = is_array( $pto->rewrite ) ? $pto->rewrite['slug'] : $cpt; $base = $pto->rewrite['with_front'] ? $wp_rewrite->front : $wp_rewrite->root; $home = untrailingslashit( home_url( $base ) ); return str_replace( $home, home_url( $base . $slug ), $url ); } }); // get original echo arg and then set echo to false $notecho = isset($args['echo']) && empty($args['echo']); $args['echo'] = FALSE; // get archives $archives = wp_get_archives($args); // prevent filter running again $done_where = $done_link = TRUE; // echo or return archives if ( $notecho ) { return $archives; } else { echo $archives; } } 

Bitte lesen Sie Inline-Kommentare für weitere Informationen zur functionsweise der function.

Jetzt gibt es ein Problem. Die URL like /events/2014/04/ 2014/04 /events/2014/04/ wird von WordPress nicht erkannt, daher müssen Sie die reqrite-Regeln hinzufügen, die diese Art von URLs verarbeiten.

Wieder können Sie eine function schreiben, die diese Regeln für Sie hinzufügt:

 function generate_cpt_archive_rules( $cpt ) { if ( empty($cpt) || ! post_type_exists($cpt) ) return; global $wp_rewrite; $pto = get_post_type_object($cpt); if ( ! $pto->has_archive ) return; $base = $pto->rewrite['with_front'] ? $wp_rewrite->front : $wp_rewrite->root; $base = trailingslashit( $base ); $slug = is_array( $pto->rewrite ) ? $pto->rewrite['slug'] : $cpt; $year = ltrim( $base . $slug . '/([0-9]{4})/?$', '/' ); $month = ltrim( $base . $slug . '/([0-9]{4})/([0-9]{2})/?$', '/' ); $day = ltrim( $base . $slug . '/([0-9]{4})/([0-9]{2})/([0-9]{2})/?$', '/' ); $index = 'index.php?post_type=' . $cpt; $rules[$year] = $index . '&m=$matches[1]'; $rules[$month] = $index . '&m=$matches[1]$matches[2]'; $rules[$day] = $index . '&m=$matches[1]$matches[2]$matches[3]'; $page = 2; foreach ( array( $year, $month, $day ) as $rule ) { $paged = str_replace( '/?$', '/page/([0-9]{1,})/?$', $rule); $rules[$paged] = $rules[$rule] . '&paged=$matches[' . $page . ']'; $page++; } return $rules; } 

Diese function generiert die Regeln, Sie müssen sie jedoch hinzufügen und leeren.

Es wird empfohlen, die Regeln für die Aktivierung des Themas (oder des Plugins) zu leeren und sie auf init zu registrieren. Sie sollten also Folgendes tun:

 function register_cpt_dates_rules() { $cpts = array( 'events' ); foreach ( $cpts as $cpt ) { foreach ( generate_cpt_archive_rules( $cpt ) as $rule => $rewrite ) { add_rewrite_rule( $rule, $rewrite, 'top' ); } } } // flushing on theme switch add_action('after_switch_theme', function() { register_cpt_dates_rules(); $GLOBALS['wp_rewrite']->flush_rules(); }); // registering on init add_action( 'init', 'register_cpt_dates_rules' ); 

Sobald Sie diese functionen zu Ihrer functions.php hinzugefügt haben (und Sie haben Ihr Theme wieder deaktiviert und aktiviert, um 'after_switch_theme' auszuführen) können Sie die Archive folgendermaßen anzeigen:

 wp_get_cpt_archives( 'events' ); 

Und es wird die Archive für Event CPT angezeigt, und der Link wird etwas sein /events/2014/04/ .

Es funktioniert auch für jährliche oder tägliche Archive:

 wp_get_cpt_archives( 'events', array( 'type'=>'yearly' ) ); wp_get_cpt_archives( 'events', array( 'type'=>'daily' ) ); 

Mit meinen beiden functionen können Sie wp_get_archives super einfach mit CPTs arbeiten.

Beachten Sie, dass der gesamte Code PHP 5.3+ erfordert.

Ich denke, GM hat alles gegeben, was Sie brauchen. Ich schrieb einen Blog-Post über die Permalink-Generierung für CPT- pre_get_posts , hatte aber noch nicht die Zeit, den anderen pre_get_posts Teil davon in einem Blog-Post-Formular zu bekommen.

Es gibt grundsätzlich 3 Teile zum Puzzle:

  1. Generieren Sie Ihre Umschreibungsregeln, um die Datumszeichenfolgen /2014/04/30 , /2014/ usw. zu lesen.
  2. Ermitteln von WP_Query, um die Abfragevariablen zu erkennen.
  3. und Erstellen der Paginierung / Archiv-Links für Sidebar-Widgets (die mein Beitrag abdeckt).