自作曲コーナーに設置してある「いいね」ボタンは、自作のWordPressプラグインです。
ショートコードでIDを書くだけで、独自の「いいね」ボタンが作れて、ボタンを押すとカウントアップしてくれて、1ページにたくさん設置できる、いわゆる「クリックカウンター」を探していたのですが、ページ単位だったりとなかなか良いものがなく、「ないのなら、作ってしまえ!」ということで、見よう見まねで作ってみました。Facebookの「いいね」は共有を目的としていますが、この「いいね」はサイト独自のもので、みんなに褒めてもらうだけを目的としたものです。
まだ、正式なプラグインとして公開できる代物ではないので、コードを紹介するに留めます。
Ajaxを使ったWordPressのプラグインとしては、むずかしいことをしていないので、すごく基礎的なコードかなぁと思います。
デモ
こんな感じで動きます。押すとカウンターが増える。それだけです。
このコードがいいなと思った人も、押してあげてください。
ちなみにここでは名古屋弁にしてあります。
Like!(1826)
使い方
編集画面にショートコードを書くだけ[bfcc id="christmas_day"]
(かっこは半角にしてください)
id には 適当な文字列を入れてください。そのIDを認識してカウントアップします。
要するにidの中身を別の文字列にするだけで、新しいカウンターを作成することになります。
同じIPの連続カウントアップは受け付けません。
bootstrapのCSSを使うことを前提として class名が「btn btn-default」のリンクを生成します。bootstrapが無い方は自分でスタイルをつけてください。
ご注意
- 自己責任でご自由にお使いください。このプログラムが損害を与えたとしても責任はとりません。
- 前処理、後処理が適当です。インストールするとwp_bf_click_counterというテーブルが作成されますが、アンイストールしても残ります。不要になったらテーブルを削除してください。
設置方法
(1)wp-content/plugins の中に、 bf-click-counter というディレクトリを作成
(2)さらにその中に bf-click-counter.php というファイル名で、以下のコードを作成。
(3)WordPressのプラグイン一覧に「BF Click Counter」が表示されるので有効化。
(4)あとは上記「使い方」を見て、じゃんじゃんショートコードを設置してください。
<?php /* Plugin Name: BF Click Counter Author: Taichi MARUYAMA Plugin URI: https://maruyama.breadfish.jp/ Description: シンプルなクリックカウンターです。 Version: 0.11 Author URI: https://maruyama.breadfish.jp/ Text Domain: bf-click-counter */ global $wpdb; global $bf_click_counter; // IDをキーにしてカウント数を格納 global $bf_click_ip; // IDをキーにしてIPアドレスを格納 /** * DBで使うテーブル名を返す * * @access public * @return void */ function bf_click_counter_get_table_name() { global $wpdb; return $wpdb->prefix . "bf_click_counter"; } /** * アクティベーション。テーブルの作成を行う。 * * @access public * @return void */ function bf_click_counter_activation() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); $table_name = bf_click_counter_get_table_name(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, keyname text NOT NULL, count int NOT NULL, ipaddress text NOT NULL, register_datetime datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, update_datetime datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, UNIQUE KEY id (id) ) $charset_collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); } register_activation_hook(__FILE__, 'bf_click_counter_activation'); /** * ロード時に変数を初期化する. * * @access public * @return void */ function bf_click_counter_initialize() { global $wpdb, $bf_click_counter, $bf_click_ip; $bf_click_counter = array(); $table_name = bf_click_counter_get_table_name(); $results = $wpdb->get_results("SELECT * FROM $table_name"); foreach($results as $one) { $bf_click_counter[$one->keyname] = $one->count; $bf_click_ip[$one->keyname] = $one->ipaddress; } } add_action('init', 'bf_click_counter_initialize'); /** * ショートコードの処理。ボタン(カウント数)を表示する * * @access public * @param mixed $atts * @return void */ function bf_click_counter_display($atts) { global $bf_click_counter; extract(shortcode_atts(array( 'id' => '0', ), $atts)); // カウンターがすでにある場合 if (array_key_exists($id, $bf_click_counter)) { return '<a href="javascript:void(0);" class="btn btn-default bf-click-counter" data-id="' . $id . '">いいね(<span class="count">' . $bf_click_counter[$id] . '</span>)</a>'; } // カウンターがない場合はカウント数ゼロでボタンを表示 return '<a href="javascript:void(0);" class="btn btn-default bf-click-counter" data-id="' . $id . '">いいね(<span class="count">0</span>)</a>'; } add_shortcode('bfcc', 'bf_click_counter_display'); /** * JavaScript(Ajax)の出力(いいねボタンの押下を受け付ける) * * @access public * @return void */ function bf_click_counter_ajax() { ?> <script> var bf_ajaxurl = '<?php echo admin_url( 'admin-ajax.php'); ?>'; jQuery(function() { jQuery('.bf-click-counter').click(function() { var self = this; jQuery.ajax({ type: 'POST', url: bf_ajaxurl, data: { 'id' : jQuery(this).attr('data-id'), 'action' : 'bf_click_counter_countup', }, success: function( response ){ jQuery(self).find('.count').html(response); } }); return false; }); }) </script> <?php } add_action( 'wp_head', 'bf_click_counter_ajax'); /** * Ajaxの受付処理 * * @access public * @return void */ function bf_click_counter_countup(){ bf_click_counter_initialize(); global $wpdb, $bf_click_counter, $bf_click_ip; $id = $_POST['id']; $ipaddr = $_SERVER["REMOTE_ADDR"]; $nowdate = date('Y-m-d h:m:s'); // 登録日付 // カウンターがすでにある場合、インクリメントしてDBをアップデート if (array_key_exists($id, $bf_click_counter)) { // 同じIPからの連続いいねは阻止 if ($bf_click_ip[$id] != $ipaddr) { $bf_click_counter[$id]++; $wpdb->update(bf_click_counter_get_table_name(), array('count' => $bf_click_counter[$id], 'ipaddress' => $ipaddr, 'update_datetime' => $nowdate), array('keyname' => $id)); } // カウンターがない場合、DBにインサート } else { $bf_click_counter[$id] = 1; // 初期値は1 $wpdb->insert(bf_click_counter_get_table_name(), array('keyname' => $id, 'count' => 1, 'ipaddress' => $ipaddr, 'register_datetime' => $nowdate)); } echo $bf_click_counter[$id]; die(); } add_action( 'wp_ajax_bf_click_counter_countup', 'bf_click_counter_countup' ); add_action( 'wp_ajax_nopriv_bf_click_counter_countup', 'bf_click_counter_countup' );