ポンコシの話②+開発日記(WPでタグクラウドをカテゴリー毎に出す、〜のカスタム投稿タイプでも使えるようにする(役にたつけどつまりませんw)

今回の投稿はポンコシ表の顔の投稿ですw

 

 

 

いつもの読者さんにとってはエロでもなんでも無いんで、ご承知ください(人´∀`)

 

 

Google検索で直接情報を見つけてきた人以外は興味ないネタでしょう。

 

 

てかエロブログになんでこんなネタ載ってんだ?と検索からきた人は思うかもしれませんw

 

 

 

 

いつもの読者さん用に、ポンコシの自己紹介兼ねて、前置きとしてなんなのか軽く説明しますと、

 

 

ポンコシ今はニートしてますが(この話はまた別の機会にw)、もともとはふつーの会社でSEやってました。

 

 

 

SE = システムエンジニア

 

ですねw

 

 

SEって言ってもその職務は色々あると思うんですけど、証券会社のネットで株取引するシステムを作るところで働いてました。

 

 

でも、自分がどこに居るのかすらわからない巨大システムのプログラムなんて、金融商品にも投資にも興味のないポンコシにはオニつまらなかったですw

 

 

で、色々あってそのクソつまらないSEの仕事は辞めて、

 

その後はサーバーやデータベース管理の仕事とかやりながら、もう一つWebアプリケーションやサイトを作る仕事をやってました。

 

 

金融は嫌いだったけど、ものづくりとデジタルは大好きな変態でしたw

 

 

 

と言うわけで、ブログ作るのもまあまあ得意な感じです。

 

そんなこんなでこんな風にエロサイト/ブログやってます。

 

 

 

 

 

それじゃ、今回の本題の開発話にじょじょに入ってきますw

 

 

 

 

ブログ制作と言えばWP、WordPress = ワードプレス

 

 

ワードプレスは、CMS。

 

CMS = コンテンツマネージメントシステム。

 

 

ブログやeコマースのサイトなんかを作る手助けをしてくれる仕組み骨組みがCMSで、WPはCMSの とある製品名。

 

CMSがOSだとすると、WPはWindowsみたいな感じ…

 

ちなみに、某韓デリのレポート投稿サイトなんかは、movable typeって別のCMSで出来てたりします。

 

 

で、このブログと嬢報部は、WPを使って作ってます。

 

(システムの中身を話すのはセキュリティ上良くないけど、何で出来てるかなんてプロはすぐ分かるので本気の攻撃者には特に情報提供している事になりません)

 

 

ポンコシはWPのプロではないけど、内部で使用されているプログラム言語が理解できるので一応改造も出来ちゃいます。

 

 

*WPは別に内部から改造出来なくても、システムがあらかじめ用意したブログの見た目は多少は改造することは出来るし、改造しないでそのまま使ってもふつうにちゃんとしたブログとして問題なく使えます。

 

 

 

で、今回の記事は、このWPの改造に関するネタって事になります(^O^)/

 

 

 

 

 

現在、嬢報部のトップページでは風俗情報のカテゴリー毎に最新記事とカテゴリー内で使われてるキーワード(= タグ)をタグクラウドとして表示しています。

 

Screen Shot 2016-01-04 at 2.54.40

風俗嬢報部トップページに表示されているカテゴリー一覧 *上画像下部

 

 

ところがどっこいこのタグクラウド、WPに用意されているテンプレートタグであるwp_generate_tag_cloudでは、記事タイプpost type = post(要するにWPのデフォルト投稿タイプってことですね)内の全カテゴリーで使用されているタグを全て取ってきて、HTMLのliリストにぶち込んで表示してくれます。

 

 

しかーし、嬢報部トップページのタグクラウド(上画像下部)では、カテゴリー毎のタグ一覧を表示したいので、全カテゴリーからタグを取得されては困りますw

 

 

というわけで、テンプレートタグwp_generate_tag_cloudを元にして、WPのデータベースからキーワード一覧を取得する時に、カテゴリーを指定してタグ一覧を取得する仕組み=関数を作りましょう、と言う事になります。

 

 

 

さっそく、以下の関数をfunction.phpにあたりに定義します。

 

<?php
/***************************************************************/
/* Ponkoshi tag cloud */
/***************************************************************/
function ponkotsu_tag_cloud($args) {
	$defaults = array(
	'smallest'=>8, 'largest'=>15, 'unit'=>'pt', 'number'=>50, 'format'=>'flat', 'separator'=>"\n",
	'orderby'=>'count', 'order'=>'RAND', 'exclude'=>'', 'include'=>'', 'link'=>'view', 'echo'=>true,
	'taxcat_name'=>'category', 'taxtag_name'=>'post_tag'
	);
	$args = wp_parse_args( $args, $defaults );

	global $wpdb;
	$query = "
	SELECT DISTINCT terms2.term_id as term_id, terms2.name as name, t2.count as count
	FROM
		$wpdb->posts as p1
		LEFT JOIN $wpdb->term_relationships as r1 ON p1.ID = r1.object_ID
		LEFT JOIN $wpdb->term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
		LEFT JOIN $wpdb->terms as terms1 ON t1.term_id = terms1.term_id,
		$wpdb->posts as p2
		LEFT JOIN $wpdb->term_relationships as r2 ON p2.ID = r2.object_ID
		LEFT JOIN $wpdb->term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
		LEFT JOIN $wpdb->terms as terms2 ON t2.term_id = terms2.term_id
		WHERE
		t1.taxonomy = '".$args['taxcat_name']."' AND p1.post_status = 'publish' AND terms1.term_id = ".$args['cat']." AND
		t2.taxonomy = '".$args['taxtag_name']."' AND p2.post_status = 'publish'
		AND p1.ID = p2.ID
	";
	$tags = $wpdb->get_results($query);
	foreach ( $tags as $key => $tag ) {
	if ( 'edit' == $args['link'] )
		$link = get_edit_tag_link( $tag->term_id, $args['taxonomy'] );
	else
		$link = get_term_link( intval($tag->term_id), $args['taxonomy'] );
	if ( is_wp_error( $link ) )
		return false;

	$tags[ $key ]->link = $link;
	$tags[ $key ]->id = $tag->term_id;
	}

	$return = wp_generate_tag_cloud( $tags, $args );
	$return = apply_filters( 'wp_tag_cloud', $return, $args );

	if ( 'array' == $args['format'] || empty($args['echo']) )
	return $return;

	echo $return;
}
?>

*ソースはhackのキュレーターgoto_jpさん提供のソースを元にしています。

 

 

やっていることは、30行目にてWPのデータベースから直接データを取得するメソッド、$wpdb->get_results()に渡すSQL文(15~28行目)をカテゴリーを指定して(関数呼び出し時に指定)タグリストを取って来れるSQL文に変更しています。

 

goto_jpさん、素晴らしい元ソースをありがとうございました。m(_ _)m

 

 

 

たーだ。

 

元ソースのままでも最高なんですが、

 

ポンコシは、

 

ポンコシブログと言う風俗嬢報部とは別のブログ(カスタム投稿タイプを使用した別ブログ)を同一システム内に構えているため、同一システム内の別ブログのカテゴリーを指定してタグクラウドを作成出来る機能が欲しかったわけです。

 

 

と言うわけで、元ソースのSQL文の26, 27行目を

 

	t1.taxonomy = 'category' AND p1.post_status = 'publish' AND terms1.term_id = " . $args['cat'] . " AND
	t2.taxonomy = 'post_tag' AND p2.post_status = 'publish'

 

から

 

	t1.taxonomy = '".$args['taxcat_name']."' AND p1.post_status = 'publish' AND terms1.term_id = ".$args['cat']." AND
	t2.taxonomy = '".$args['taxtag_name']."' AND p2.post_status = 'publish'

 

に変更して、関数呼び出しの引数で、カスタム投稿タイプに設置したカスタム分類(ポンコシブログ内のカテゴリーとタグ)を渡すことが出来る様にしました。

 

 

もちろん、SQL文に入れるための引数を取得するコードを9行目に追加してあります。

 

	'taxcat_name'=>'category', 'taxtag_name'=>'post_tag'

 

*ここで設定されている値(categoryとpost_tag)はWPのデフォルト投稿タイプにデフォルトで設定されているカテゴリーとタグのシステム上の名称です。これを先に定義おくことで、関数呼び出し時の引数が省略された場合には、デフォルト投稿タイプの中からタグクラウドを検索する様になるので非常に重要です。

 

 

こうすることで、このponkotsu_tag_cloudを呼び出す時に、タグクラウドを作成したいカテゴリーのIDと、カテゴリー型のカスタム分類と、タグ型のカスタム分類を指定することで、カスタム投稿タイプ(正確にはカスタム分類)の垣根を超えたタグクラウドが作成出来る様になります。

 

 

最後に、この関数の使い方の例を載せておきます。

 

 

以下のコードを、htmlソースのタグクラウドを表示させたい箇所にdivタグなんかで囲んで書いておけば、後々cssでスタイルを当てられるタグクラウドが生成されます。

 

<?php
	$catid = get_term_by('name', single_term_title('',false), 'ponkotsu_category');
	ponkotsu_tag_cloud(array('cat'=>$catid->term_id, 'taxcat_name'=>'ponkotsu_category', 'taxtag_name'=>'ponkotsu_tag'));
?>

 

 

少し解説しますと、2行目でタグクラウドを表示したい対象のカテゴリーIDを取得しています。

 

その後、ponkotsu_tag_cloud関数に引数として、取得したIDと、カテゴリー型のカスタム分類名=ponkotsu_categoryと、タグ型のカスタム分類名=ponkotsu_tagの3つを渡して完了となります。

 

 

 

結果、こんな感じでカテゴリー毎のタグクラウドが表示出来る様になります(^O^)/

 

Screen Shot 2016-01-04 at 2.38.12

風俗嬢報部(WPデフォルト投稿タイプ)のカテゴリー別タグクラウド

 

 

Screen Shot 2016-01-04 at 2.37.30

ポンコツブログ(カスタム投稿タイプ)のカテゴリー別タグクラウド

 

 

 

以上が今回のWP改造ネタになります。

 

 

 

ポンコシも初めはどうやれば良いのか迷いましたが、どこの世界にも屈強な戦士はいるものです。

 

そんな先人達の知恵を借りてひとひねり加えることで人類はまた進化していけるのかと思いますw

 

 

 

今回のハック、設置の仕方や使い方で質問等ある方は遠慮なくコメントくだせー^ ^

 

エロい方でもエロくない方でも大歓迎(^O^)/

 

 

 

 

まあこんな感じでこのブログではポンコシの非エロな日常も書いてくので、今後もポンコシの好きなITネタはふんだんに書いていこうと思います 😎

 

 

エロネタ希望の読者さんはスルーしてもらえたら幸いです😂🙏

 

 

 

 

 

 

 

 

コメントを残す