web-dev-qa-db-ja.com

カテゴリからの投稿を表示するためのデフォルトカレンダーの上書き

デフォルトのWP calendar(get_calendar())を修正して、特定のカテゴリからの投稿を表示し、それをショートコードとして使用するようにしています。

これが私がしたことです:

(wp-includesから)コアからget_calendar()関数を通して私の子テーマのfunctions.phpファイルにコピーされました。それを「独立した」カレンダーにするために、get_calendar()関数の名前をosu_get_calendar()に変更し、osu_get_calendar()を使用してカレンダーを自分のテンプレートに正常にハードコードしました。

今私は私の手を少し汚くして次のことをやろうとしています:

1)カレンダーに表示される投稿を特定のカテゴリに制限します(訪問者が月ごとに投稿を検索できるように、前後のナビゲーションを維持します)。

2)ショートコードにして、クライアントが自分の投稿の一番下に選択したカテゴリの投稿をカレンダーに埋め込むことができるようにします。

今のところ1)にとどまっているのは、SQLクエリを修正して特定のカテゴリから投稿を取得する必要があるようだからです。以下のget_calendar()関数のコードを見て、データベースから取得した投稿を特定のカテゴリからの投稿にフィルタするにはどうすればよいですか。そこに他のSQLクエリがあります、しかしうまくいけば誰かが今のところこのもので私を助けることができる:

$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");

ありがとう、

おす

1
Osu

あなたは正しい軌道に乗って出発していました、しかしあなたはあなたがまだ追加する必要があったWordPressの束縛のいくつかのビットがありました。私が使用したいアプローチは、クラス内のget_calendar()への呼び出しをカプセル化することです。そうすれば、低レベルの'query'フックを使うことができますが、ただ一つの呼び出しのためにそれを使うことができます。

そこで私はYourSite_Category_Calendar()というクラスを使ってあなたのテーマのfunctions.phpファイル(あるいはあなたが書いているプラ​​グインのための.phpファイル)にドロップできる例を書きました。 get_calendar()への呼び出しの代わりにそれを呼び出します。

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

そして、これがクラスのコードです。

<?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();

更新

私が必要としていたショートコードと同様に必要なURL書き換えを追加したコメントに基づいて:

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