it-swarm.com.de

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

Ich versuche, den Standardkalender WP (get_calendar ()) so zu ändern, dass Beiträge aus einer bestimmten Kategorie angezeigt werden, und verwende diesen dann als Shortcode.

Folgendes habe ich getan:

Über die Funktion get_calendar () vom Kern (von wp-includes) in die Datei functions.php meines untergeordneten Themas kopiert. Um es zu einem "unabhängigen" Kalender zu machen, habe ich den Namen der Funktion get_calendar () in osu_get_calendar () geändert und den Kalender mit osu_get_calendar () erfolgreich in meine Vorlage hardcodiert.

Jetzt versuche ich, meine Hände ein bisschen schmutziger zu machen und mache Folgendes:

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 daraus einen Shortcode, damit mein Kunde im Wesentlichen einen Kalender mit Beiträgen aus einer Kategorie einbetten kann, die er am Ende seiner Beiträge auswählt.

Ich bleibe im Moment bei 1), da es so aussieht, als müsste ich die SQL-Abfragen so ändern, dass sie Beiträge aus einer bestimmten Kategorie abrufen. Wenn ich mir den Code unten von der Funktion get_calendar () ansehe, wie würde ich die aus der Datenbank abgerufenen Posts so filtern, dass sie aus einer bestimmten Kategorie stammen? Es gibt noch andere SQL-Abfragen, aber hoffentlich kann mir vorerst jemand dabei helfen:

$previous = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year
        FROM $wpdb->posts
        WHERE post_date < '$thisyear-$thismonth-01'
        AND post_type = 'post' AND post_status = 'publish'
            ORDER BY post_date DESC
            LIMIT 1");
    $next = $wpdb->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

1
Osu

Sie haben auf dem richtigen Weg begonnen, aber Sie hatten einige Teile der WordPress-Hookage, die Sie noch hinzufügen mussten. Ein Ansatz, den ich gerne verwende, besteht darin, einen Aufruf von get_calendar() in einer Klasse zu kapseln, damit wir den einfachen Hook 'query' verwenden können, aber nur für diesen einen Aufruf.

Also habe ich ein Beispiel geschrieben, das Sie mithilfe einer Klasse in die functions.php-Datei Ihres Themas (oder in eine .php-Datei für ein Plugin, das Sie möglicherweise schreiben) einfügen können Ich habe YourSite_Category_Calendar() genannt, und so würden Sie es anstelle Ihres Aufrufs an get_calendar() nennen:

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

Und hier ist der Code für die Klasse:

<?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('<tbody>',$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}<tbody>{$body}";
  }
  function query($query) {
    if ($this->category) {
      global $wpdb;
      $find = "FROM {$wpdb->posts}\\s+WHERE";
      $add =<<<SQL
INNER JOIN {$wpdb->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 habe ich die URLs hinzugefügt, die neu geschrieben werden müssen, sowie einen Shortcode, den Sie folgendermaßen aufrufen würden:

[category-calendar category="party"]
3
MikeSchinkel