Überschreiben des Standardkalenders zum Anzeigen von Beiträgen aus einer Kategorie

Ich versuche, den Standard-WP-Kalender (get_calendar ()) so zu ändern, dass er Beiträge aus einer bestimmten Kategorie anzeigt und diese dann als Shortcode verwendet.

Folgendes habe ich getan:

Über die function get_calendar () vom core (von wp-includes) in die functions.php-Datei meines untergeordneten Themas kopiert. Um es zu einem “unabhängigen” Kalender zu machen, habe ich den Namen der function get_calendar () in osu_get_calendar () geändert und den Kalender erfolgreich mit osu_get_calendar ();

Jetzt versuche ich, meine Hände ein wenig schmutziger zu machen und folgendes zu tun:

1) Schränken Sie die im Kalender angezeigten Beiträge auf eine bestimmte Kategorie ein (unter Beibehaltung der vorherigen und nächsten Navigation, damit Besucher diese Beiträge nach Monat durchsuchen können)

2) Machen Sie es zu einem Shortcode, damit mein Kunde einen Kalender mit Beiträgen aus einer Kategorie einbetten kann, die er am Ende seiner Beiträge auswählt.

Ich stecke auf 1) im Moment, wie es aussieht, muss ich die SQL-Abfragen ändern, so dass es Beiträge aus einer bestimmten Kategorie zieht. Sehen Sie sich den folgenden Code aus der function get_calendar () an: Wie würde ich die aus der database abgerufenen Posts so filtern, dass sie aus einer bestimmten Kategorie stammen? Es gibt noch andere SQL-Abfragen, aber hoffentlich kann mir jemand vorerst helfen:

$previous = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year FROM $wpdb->posts WHERE post_date get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year FROM $wpdb->posts WHERE post_date > '$thisyear-$thismonth-01' AND MONTH( post_date ) != MONTH( '$thisyear-$thismonth-01' ) AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date ASC LIMIT 1"); 

Vielen Dank,

osu

Solutions Collecting From Web of "Überschreiben des Standardkalenders zum Anzeigen von Beiträgen aus einer Kategorie"

Du warst auf dem richtigen Weg, aber du hattest einige WordPress-Lücken, die du noch hinzufügen musstest. Ein Ansatz, den ich verwenden möchte, besteht darin, einen Aufruf von get_calendar() in einer class zu kapseln, so dass wir den 'query' Hook auf niedriger Ebene verwenden 'query' aber nur für den einen Aufruf verwenden können.

Also habe ich ein Beispiel geschrieben, das du in die functions.php Datei deines Themes (oder in eine .php Datei für ein Plugin, das du vielleicht schreibst) mit einer class namens YourSite_Category_Calendar() , und so würdest du es nennen anstelle des Aufrufs von get_calendar() :

 $cc = new YourSite_Category_Calendar('your-category'); echo $cc->get_calendar(); 

Und hier ist der Code für die class:

 < ?php class YourSite_CategoryCalendar { var $category; var $initial; var $echo; static function on_load() { add_shortcode('category-calendar',array(__CLASS__,'shortcode')); add_action('init',array(__CLASS__,'init')); global $wp_rewrite; $wp_rewrite->add_rule('^events/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)/?$', 'index.php?post_type=event&year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&category_name=$matches[4]', 'top'); $wp_rewrite->flush_rules(false); // Remove this after you've got it working } static function shortcode($attributes) { $attributes = wp_parse_args($attributes,array( 'category' => false, )); $cc = new YourSite_CategoryCalendar($attributes['category']); echo $cc->get_calendar(); } static function init() { register_post_type('event',array( 'hierarchical' => true, 'label' => 'Events', 'public' => true, 'show_ui' => true, 'query_var' => 'event', 'rewrite' => array('slug' => 'events'), 'supports' => array('title','editor','custom-fields'), 'taxonomies' => array('category'), )); } function __construct($category,$initial=true,$echo=true) { $this->category = $category; $this->initial = $initial; $this->echo = $echo; } function get_calendar() { add_filter('query',array(&$this,'query')); ob_start(); get_calendar($this->category,$this->initial,$this->echo); $calendar = ob_get_clean(); remove_filter('query',array(&$this,'query')); list($header,$body) = explode('',$calendar); $find = '#(href="http://[^/]+)(/[0-9]{4}/[0-9]{1,2}/[0-9]{1,2}/)#'; $replace = '$1/events$2'.$this->category.'/"'; $body = preg_replace($find,$replace,$body); return "{$header}{$body}"; } function query($query) { if ($this->category) { global $wpdb; $find = "FROM {$wpdb->posts}\\s+WHERE"; $add =< <term_relationships} calendar_term_relationship ON calendar_term_relationship.object_id={$wpdb->posts}.ID INNER JOIN {$wpdb->term_taxonomy} calendar_term_taxonomy ON calendar_term_taxonomy.term_taxonomy_id=calendar_term_relationship.term_taxonomy_id INNER JOIN {$wpdb->terms} calendar_term ON calendar_term.term_id=calendar_term_taxonomy.term_id WHERE calendar_term_taxonomy.taxonomy='category' AND calendar_term.slug='%s' AND SQL; $replace = "FROM {$wpdb->posts} {$add} "; $query = preg_replace("#{$find}#Us",$replace,$query); $query = preg_replace("#post_type\s*=\s*'post'#","post_type='event'",$query); $query = $wpdb->prepare($query,$this->category); } return $query; } } YourSite_CategoryCalendar::on_load(); 

AKTUALISIEREN

Basierend auf den Kommentaren, die ich hinzugefügt habe, die URLs Neuschreiben benötigt sowie einen Shortcode, den Sie so nennen würden:

 [category-calendar category="party"]