WordPress カテゴリーの名前をカテゴリーIDを指定して取得
簡単なことなんですけどね、検索すると、投稿からカテゴリーを取得するものばっかり出てきましたんで(^_^;
書いておきます。
//カテゴリーIDが21番のカテゴリー名を取得 $category_info = get_category(21); echo $category_info->name; ?>
簡単なことなんですけどね、検索すると、投稿からカテゴリーを取得するものばっかり出てきましたんで(^_^;
書いておきます。
//カテゴリーIDが21番のカテゴリー名を取得 $category_info = get_category(21); echo $category_info->name; ?>
WordPressには便利な月別のアーカイブ機能がありますが、これって全部の投稿を出しちゃうんですよね。
月別、カテゴリー別で、たとえば投稿を表示するページのサイドバーにウィジェットを出す。というのをやってみます。
やっていることはまとめると
です。
下記はサンプルコードで、荒削りな部分もありますが、ご容赦ください!
functions.phpに下記を追加。
ウィジェット追加画面で、下記で追加したウィジェットを追加する。
/* カテゴリごとの月別アーカイブのリンクリスト作成 * wp-includes\default-widgets.php * class WP_Widget_Archives extends WP_Widget をコピーして作成 * */ class MyWidgetItem extends WP_Widget { function __construct() { $widget_ops = array('classname' => 'widget_archive', 'description' => 'カテゴリーごとの月別アーカイブ', 'name' => 'カテゴリーごとの月別アーカイブ' ); parent::__construct('archives', __('Archives'), $widget_ops); } function widget( $args, $instance ) { extract($args); $c = ! empty( $instance['count'] ) ? '1' : '0'; $d = ! empty( $instance['dropdown'] ) ? '1' : '0'; $title = apply_filters('widget_title', empty($instance['title']) ? __('Archives') : $instance['title'], $instance, $this->id_base); echo $before_widget; if ( $title ) echo $before_title . $title . $after_title; if ( $d ) { ?> <select name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value=""><?php echo esc_attr(__('Select Month')); ?></option> <?php wp_get_archives(apply_filters('widget_archives_dropdown_args', array('type' => 'monthly', 'format' => 'option', 'show_post_count' => $c))); ?> </select> <?php } else { ?> <ul> <?php //カテゴリーテンプレートの場合 if($_GET['cat']){ $cat_id = $_GET['cat']; $cat_id = intval($cat_id); }elseif(!$cat_id){ $cats = get_the_category(); $cat_id = $cats[0]->cat_ID; } wp_get_archives_bycat(apply_filters('widget_archives_args', array('type' => 'monthly', 'show_post_count' => $c)), $cat_id); ?> </ul> <?php } echo $after_widget; } function update( $new_instance, $old_instance ) { $instance = $old_instance; $new_instance = wp_parse_args( (array) $new_instance, array( 'title' => '', 'count' => 0, 'dropdown' => '') ); $instance['title'] = strip_tags($new_instance['title']); $instance['count'] = $new_instance['count'] ? 1 : 0; $instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0; return $instance; } function form( $instance ) { $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => 0, 'dropdown' => '') ); $title = strip_tags($instance['title']); $count = $instance['count'] ? 'checked="checked"' : ''; $dropdown = $instance['dropdown'] ? 'checked="checked"' : ''; ?> <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label> <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p> <p> <input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="<?php echo $this->get_field_id('dropdown'); ?>" name="<?php echo $this->get_field_name('dropdown'); ?>" /> <label for="<?php echo $this->get_field_id('dropdown'); ?>"><?php _e('Display as dropdown'); ?></label> <br/> <input class="checkbox" type="checkbox" <?php echo $count; ?> id="<?php echo $this->get_field_id('count'); ?>" name="<?php echo $this->get_field_name('count'); ?>" /> <label for="<?php echo $this->get_field_id('count'); ?>"><?php _e('Show post counts'); ?></label> </p> <?php } } add_action('widgets_init', create_function('', 'return register_widget("MyWidgetItem");')); //上記のウィジェットから呼ばれる、アーカイブリスト出力の関数 function wp_get_archives_bycat($args = '', $cat_id =null) { global $wpdb, $wp_locale; $defaults = array( 'type' => 'monthly', 'limit' => '', 'format' => 'html', 'before' => '', 'after' => '', 'show_post_count' => false, 'echo' => 1, 'order' => 'DESC', ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); if ( '' == $type ) $type = 'monthly'; if ( '' != $limit ) { $limit = absint($limit); $limit = ' LIMIT '.$limit; } $order = strtoupper( $order ); if ( $order !== 'ASC' ) $order = 'DESC'; $output = ''; //SQLを改造、 cat_idのカテゴリーの月別のリストを作る if ( 'monthly' == $type ) { $query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts INNER JOIN wp_term_relationships ON wp_posts.id = wp_term_relationships.object_id INNER JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id WHERE wp_term_taxonomy.term_taxonomy_id = $cat_id AND wp_term_taxonomy.taxonomy = 'category' AND wp_posts.post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date $order $limit"; $key = md5($query); $cache = wp_cache_get( 'wp_get_archives' , 'general'); if ( !isset( $cache[ $key ] ) ) { $arcresults = $wpdb->get_results($query); $cache[ $key ] = $arcresults; wp_cache_set( 'wp_get_archives', $cache, 'general' ); } else { $arcresults = $cache[ $key ]; } if ( $arcresults ) { $afterafter = $after; foreach ( (array) $arcresults as $arcresult ) { $url = get_month_link( $arcresult->year, $arcresult->month ); /* translators: 1: month name, 2: 4-digit year */ $text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($arcresult->month), $arcresult->year); //カテゴリーのIDを追加 $url .='&cat_id='.$cat_id; if ( $show_post_count ) $after = ' ('.$arcresult->posts.')' . $afterafter; $output .= get_archives_link($url, $text, $format, $before, $after); } } } if ( $echo ) echo $output; else return $output; }
archive.phpに下記を追加
<?php $cat_id = intval($_GET['cat_id']); $m = intval($_GET['m']); $year = substr($m, 0, 4); $month = substr($m, 5, 7); //ページネーションのために追加 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array('year' => $year, 'monthnum' => $month, 'cat' =>$cat_id, 'posts_per_page' => 20, 'paged' => $paged); query_posts( $args ); while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; twentytwelve_content_nav( 'nav-below' );
?>
WordPress3.1.4
WordPress インストールしたディレクトリと違うところでサイトを作るで紹介したように、やればOKです。
これ以下はまだ調査中のことを書いています。
それだけなんですが、このままだと、たとえば次のような構成になっていた場合
公開URL http://publish.hogehoge.com 本体URL http://admin.hogehoge.com
テーマファイルのパスとして表示されるのは
http://admin.hogehoge.com/wp-content/themes …以下略
なんですよね。
つまり、公開URLで見られる画像やCSSのパスが本体URLになるというわけです。
これが意図にあっているかどうかなんですが。
本体URLへのパスは管理画面の設定→一般→WordPress のアドレス (URL)を変更すればよいです。
じゃあ、これをadminのないhttp://publish.hogehoge.comへ書き換えて、wp-contents以下をhttp://publish.hogehoge.com以下におけば動作するのでは?
と思いますよね。
表側のhttp://publish.hogehoge.comは動作しますが、管理画面がダメになっちゃいます。
http://admin.hogehoge.comで直接アクセスしてログインできても、http://publish.hogehoge.comへリダイレクトされるんで、管理側の機能が全部動作しなくなっちゃうんですよね。
なので、Apacheとかの設定でどうにかするしかないのかな?というのが、今のところの結果です。
いい加減な記憶ですが、昔のWordPressだと、確か管理画面の設定は、管理画面からできたんじゃないかな?って気がします。
それができなくなったのが残念ですね。
もうちょっと調べます。
WordPress 3.2.1
WordPressをインストールするところは
http://hogehoge.com/wordpress/
でも、実際は
としてサイトを見せたい、と言う時はありますよね。
そういう時は、次の手順でやってみましょう。
require('./wp-blog-header.php');
↑と書いてある部分を
require('wordpress/wp-blog-header.php');
に変更。そのindex.phpを、トップディレクトリへ設置。
これで終わりです。
最新のバージョン(現時点で3.2.1)だと、.htaccessファイルの書き換えは要りません。
WordPressには、便利な機能「予約投稿」というものがあります。
Postでも、Pageでも、未来の日付を投稿時に設定しておけば、設定した日時に更新がされます。
とても便利な機能です。
しかし、これは「まだ投稿していないPost(あるいはPage)」の場合の機能なんですね。
たとえば、昔に投稿したページの内容を書き変えたいのだけれど、理由があってまだ変更したくない。
ある特定の日時でしか変更したくない。
というニーズには対応していません。
デフォルトではこの機能はないのです。
予約投稿にすると、投稿したpostやPage自体がサイトからなくなってしまうのです。
ブログだと、あまりそういう機能は必要ないかと思いますが、企業用ホームページなどをWordPressを作る場合は、これがあると断然便利です。
新製品の発表とか、人事とか、そういうのですね。
で、この機能をプラグインで実現できます。
Revisionary
http://wordpress.org/plugins/revisionary/
WordPress3.0以上が対応バージョンです。
リビジョンというものを利用しますので、少々使い方が複雑です。
なので、書いておきます。
すると、青いボタンが「Schedule Revision」となります。
ステータスが「公開済み」となっているのも確認してください。
すると、予約した変更も消えません。
あとは時間まで待ってみましょう!
ちなみにですね、このプラグインにたどりつくまでに紆余曲折あり、いろんなプラグインを試したので、書いておきます。
下記の二つのプラグインは、上記に書いたようなことができそうですが、実際は、未来の日付で投稿された投稿を今すぐ見せる、というタイプです。
The Future Is Now
http://wordpress.org/plugins/the-future-is-now/other_notes/
WP Scheduled Posts
http://wordpress.org/plugins/wp-scheduled-posts/
そんなん何に役立つの?とか思うかもしれませんが、イベント関係のブログで、未来のイベントの告知をしたい、などの時に有効です。