【DW Question & Answer】禁止ワードを含む投稿の送信を拒否する

シンプルなので使いやすいDW Question & Answerですがスパム問題はつきものです。
BBpressはWordPressのディスカッション設定で禁止ワードを設定すれば連動していて楽なのですがDW Question & Answerは禁止ワード対策は自分でするしか無いのです。

いろいろと試行錯誤したのですが、シンプルにjavaScriptで禁止ワードが含まれていたらアラートで拒否する方法を。
下手にプラグインを入れて重くなるよりは良いと思います。
あとついでテキストエリアをシンプルに変えてます。


dw-question-answer\templates\question-submit-form.php
の11行目formの上辺りに以下を加えてみて下さい。
※ここでのtest(monmon)という関数はお好きなものに変えて下さい。

<script type="text/javascript">
var badWords = ["アホ","バカ"];
var regex = new RegExp(badWords.join("|"));
function test(monmon) {
if (monmon.match(regex) != null) {
alert("禁止文字が含まれています");
return false;
}
return true;
}
</script>


次にformにaction="javascript:alert('sumbit!')" onsubmit="return test(this.monmon.value)"を加えます

<form method="post" class="dwqa-content-edit-form" enctype="multipart/form-data">

<form method="post" action="javascript:alert('sumbit!')" onsubmit="return test(this.monmon.value)" class="dwqa-content-edit-form" >

次に禁止ワード対象となるフィールド(タイトルや本文)にid=monmonを加えます。ここでは本文を対象とします。
DW Question & Answerのテキストエリアをシンプルなテキストエリアに代えてます。

<p><?php dwqa_init_tinymce_editor( array( 'content' => $content, 'textarea_name' => 'question-content', 'id' => 'question-content monmon') ) ?></p>

を以下にまるっと変えてidに"monmon"をつけています。↓

<textarea rows="5" cols="100%" name="question-content" id="monmon" placeholder="最大800文字まで記入できます。" minlength='20' maxlength='800' required></textarea>

※pleceholderや文字数などはご自身で好きに変えて下さい。。

最後にsubmitに"submit" formaction="#"をつけます。以下に変えて下さい。
submitのコードは最後の方にあります

<input type="submit" formaction="#" name="dwqa-question-submit" value="<?php _e( 'Submit', 'dwqa' ) ?>" class="cp_btn">

とりあえずこれでテストすると下記のようにエラーが出ることを確認して下さい。
f:id:meijiro:20180930184355j:plain


以上です。
jsファイルを外部に設置したり禁止ワードを増やしたりカスタマイズ出来るかと思います。このままでも良いですが外部に設置することで別のページでもidにmonmonをつければ同じ動作ができるので便利だと思います。
あと、javaScriptの関数に-(ハイフン)が使えないので、くれぐれもDW Question & Answerのnameを使用せずに(なぜかnameには全て-を使っている!)新たにid="monmon"など別のものを設置して下さい。

【WP bbPress】で通報機能にReportContactを使った際に起こる表示崩れを直す

コメントを開放している場合や投稿系サイトを制作する上でスパムの餌食となりやすいWordpressですのでサイトを健全に保つためにも通報機能は必須ですね。
それが簡単にできちゃうReportContactがおすすめです。

本題はこの便利なReportContactですが、bbPressだと表示崩れが起きちゃうんです。
原因は単純でCSS上でBBPとReportContactのliタグが拮抗しちゃってるだけなんですけど...それがわからなくて利用を諦める人がいると勿体無いと思いますので修正する箇所を落としておきます。

bbPress+ReportContact

プラグイン:ReportContact
詳細はこちらの方が分かりやすく説明されていました(ありがたいことに日本語翻訳版も用意してくれている)
WordPressでYahoo知恵袋などにある「違反通報」と同じ機能を追加できるプラグイン「Report Content」 | Knowledge Base

設定では【投稿、オート】でとりあえずbbPressのページを確認すると表示されていないことがわかります。
なので独自タグを通報を設置したい箇所に加えます。

通報ボタンのタグ

<?php wprc_report_submission_form(); ?>

これを本文の後に付け加える場合
wp-content\plugins\bbpress\templates\default\bbpress\loop-single-reply.php
の最後の方

		<?php do_action( 'bbp_theme_after_reply_content' ); ?>

	</div><!-- .bbp-reply-content -->

		<?php do_action( 'bbp_theme_after_reply_content' ); ?>
		<?php wprc_report_submission_form(); ?><!--ここに通報ボタンを加えました-->
	</div><!-- .bbp-reply-content -->

このままでは表示が崩れていますので
wp-content\plugins\bbpress\templates\default\bbpress\loop-replies.php
40行目辺りのliタグをdivに変更すれば表示崩れが直ります。

	<li class="bbp-body">

		<?php if ( bbp_thread_replies() ) : ?>

			<?php bbp_list_replies(); ?>

		<?php else : ?>

			<?php while ( bbp_replies() ) : bbp_the_reply(); ?>

				<?php bbp_get_template_part( 'loop', 'single-reply' ); ?>

			<?php endwhile; ?>

		<?php endif; ?>

	</li><!-- .bbp-body -->

↓↓

	<div class="bbp-body">

		<?php if ( bbp_thread_replies() ) : ?>

			<?php bbp_list_replies(); ?>

		<?php else : ?>

			<?php while ( bbp_replies() ) : bbp_the_reply(); ?>

				<?php bbp_get_template_part( 'loop', 'single-reply' ); ?>

			<?php endwhile; ?>

		<?php endif; ?>

	</div><!-- .bbp-body -->

f:id:meijiro:20180915031125j:plain

((o・д・)bGood Luck

【WP bbPress】トピックごとの返信に番号1~を付ける

【bbpress】How to add new reply number(1~) by topic.

bbPressの返信単体には一応reply_idがついているのです。しかし、全トピックで通し番号になっているので数字の桁も大きく、尚且つトピック上で連番になっておらず不自然です。

なのでトピックごとに1~の連番を付加する方法を紹介します。
これがトピックごとの返信の番号(レス番号)にあたるコードとなります。
This code is new reply number(1~) by topic.

		<?php echo bbp_reply_position( $reply_id ); ?>


wp-content\plugins\bbpress\templates\default\bbpress\loop-single-reply.php
16行目あたり

		<span class="bbp-reply-post-date"><?php bbp_reply_post_date(); ?></span>

を以下に変更追記してみて下さい。 Change to the next code.

		<span class="bbp-reply-post-date"><?php echo bbp_reply_position( $reply_id ); ?><?php bbp_reply_post_date(); ?></span>

↓↓すると日付の前に番号がつくことが確認できたと思います。別のトピックも1~の番号がついていると思います。
f:id:meijiro:20180913105200j:plain


同じファイルの27行目あたりここが↓本来のPOST_IDになりますので This code is bbPress original reply_id.

		<a href="<?php bbp_reply_url(); ?>" class="bbp-reply-permalink">#<?php bbp_reply_id(); ?></a>

↓↓

		<a href="<?php bbp_reply_url(); ?>" class="bbp-reply-permalink">#<?php echo bbp_reply_position( $reply_id ); ?></a>

このようにaタグに入れると尚自然かもしれませんね!

f:id:meijiro:20180913103941j:plain

↓↓

f:id:meijiro:20180913110714j:plain

【DW Question & Answer】Emailと名前を必須から匿名にする方法

引き続きDW Question & Answerについて、デフォルトではEmailと名前は必須になっていますので、それを匿名にする方法をメモっておきます。
?How to use DW Question & Answer anonymous without entering email address.

wp-content\plugins\dw-question-answer-pro\templates\answer-submit-form.php
(pro)wp-content\plugins\dw-question-answer-pro\templates\styles\default\answer-submit-form.php
20行目あたり

		<p>
			<label for="user-email"><?php _e( 'Your Email', 'dwqa' ) ?></label>
			<?php $email = isset( $_POST['user-email'] ) ? $_POST['user-email'] : ''; ?>
			<input type="email" class="dwqa-question-anonymous-email" name="user-email" value="<?php echo $email ?>">
		</p>
		<p>
			<label for="user-name"><?php _e( 'Your Name', 'dwqa' ) ?></label>
			<?php $name = isset( $_POST['user-name'] ) ? $_POST['user-name'] : ''; ?>
			<input type="text" class="dwqa-question-anonymous-name" name="user-name" value="<?php echo $name ?>" >
		</p>

を以下に変更すればOK

		<p>
			<label for="user-email"><?php _e( 'Your Email', 'dwqa' ) ?></label>
			<?php $email = isset( $_POST['user-email'] ) ? $_POST['user-email'] : ''; ?>
			<input type="hidden" class="dwqa-question-anonymous-email" name="user-email" value="anonymous@yoursite.com">
		</p>
		<p>
			<label for="user-name"><?php _e( 'Your Name', 'dwqa' ) ?></label>
			<?php $name = isset( $_POST['user-name'] ) ? $_POST['user-name'] : ''; ?>
			<input type="text"  name="user-name"  value="anonymous">
		</p>

すみません、これは力技です。。
Emailをhiddenで非表示にしてvalue="anonymous@yoursite.com"を入れていますので、ここを届かないメールアドレスに変えて下さい。
名前のテキストエリアは予めvalue="anonymous"を入れてありますのでanonymousの部分を匿名などに変えてください。

本来は名前とEmailを入力しないで送信した場合こちらで指定した値”anonymous”が送れることが一番良いと思うので、これについてはもう少しみてみます。。

【DW Question & Answer】回答にレス番を表示させる方法

ヤフー知恵袋のような仕組みが作れるDW Question & Answerプラグインですが、回答者ごとにレス番を表示させる方法をメモっておきます。
How to display ReplyID(answerID).

プラグイン内部を触りますのでバックアップは取っておいて下さい。。。
wp-content\plugins\dw-question-answer\templates\scontent-single-answer.php
(pro版)wp-content\plugins\dw-question-answer-pro\templates\styles\default\scontent-single-answer.php

23行目

<?php printf( __( '<span><a href="%1$s">%2$s%3$s</a> %4$s answered %5$s ago</span>', 'dwqa' ), dwqa_get_author_link( $user_id ), get_avatar( $user_id, 48 ), get_the_author(), dwqa_print_user_badge( $user_id ), human_time_diff( get_post_time( 'U', false ), current_time( 'timestamp' ) ) ) ?>
		<?php if ( 'private' == get_post_status() ) : ?>

上記コードが回答者の名前の箇所になります。
なので上記コードの前あたりに
↑This code is answers username.

<?php echo get_the_ID()?>

を挿入すればOKです。
↑and add this code.

【WP Job Manager】カテゴリー(職種)をシングルページで表示させる

求人サイトなんかを作るにはもってこいのWP Job Managerですが、カテゴリー(職種)を付加できるもののデフォルトのシングルページ(求人詳細ページになります)では肝心のカテゴリーが表示されないんです。
会社の情報としてもしっかりと表示されてほしいかと思いますので以下を追記することで表示されます。

<?php the_terms( $post->ID, 'job_listing_category', '', ' / ' ); ?>

シングルページ(求人詳細ページ)はtemplateファイルの「single-job」がついたファイルになります。

例を挙げあると
plugins\wp-job-manager\templates\content-single-job_listing.phpをダウンロードしてテキストエディタで開いて下さい。

		<div class="job_description">
			<?php wpjm_the_job_description(); ?>
		</div>

の上あたりに上記コードを入れてアップロードしてみて下さい。
ブラウザでカテゴリーが表示されることが確認できると思いますので、divで囲うなりcssで表示を変えればOK

【WordPress】EventManagerで予約項目を増やす方法

EventManagerというプラグインで予約するときの項目を増やす方法です。

wp-content/plugins/events-manager/em-functions.php
テキストエディタで開いて下さい。

ここでは住所を追加したいと思います。
以下のコードを追記して下さい。

function bweb_add_custom_event_fields(){
	?>
		<p>
			<label for='user_company'><?php esc_html_e('住所', 'textdomain'); ?></label>
			<input type="text" name="user_company" id="user-company"  class="input" value="<?php if(!empty($_REQUEST['user_company'])) echo esc_attr($_REQUEST['user_company']); ?>" />
		</p>

	<?php
}
add_action('em_register_form','bweb_add_custom_event_fields');


function  bweb_save_custom_event_fields (){
	global $EM_Booking ;
	if( ! empty( $_REQUEST['user_company'] ) ){
			$EM_Booking->booking_meta['registration']['user_company'] = wp_kses( $_REQUEST['user_company'], array() );
	}
}
add_filter('em_booking_add','bweb_save_custom_event_fields');	


function bweb_table_custom_event_fields($template, $EM_Bookings_Table){
        $template['user_company'] = __('住所', 'textdomain');
        return $template;
}
add_action('em_bookings_table_cols_template', 'bweb_table_custom_event_fields',10,2);
 
 
function bweb_display_col_custom_event_fields($val, $col, $EM_Booking, $EM_Bookings_Table, $csv){
        if( $col == 'user_company' ){
                $val = $EM_Booking->get_person()->user_company;               
        }
        return $val;
}
add_filter('em_bookings_table_rows_col','bweb_display_col_custom_event_fields', 10, 5);

上記コードにある二箇所の「住所」を好きな項目に変更してください。
閉じてアップロードすれば項目が追加されたはずです。

データベースにも追加されますので、管理画面の予約管理→歯車を押せば項目をドロップすればCMSに落とす際にも追加されます。



※追記です
自動返信メールで上記で追加した項目のプレースホルダーが必要かと思います。その場合は、
wp-content/plugins/events-manager/classes/em-booking.php
1029行目あたりからメールで使えるプレースホルダーの設定がありますので

				case '#_RESCOMPANY' : //deprecated
				case '#_BOOKINGCOMPANY':
					$replace = $this->get_person()->user_company;
					break;

を追加してアップロードして下さい。
これでメール設定で#_BOOKINGCOMPANYが使えるようになります。

bbpress sort topic repliesを利用したときリダイレクトを最初のページにする

引き続きWordPressプラグインbbpress について

bbpress のトピック内のReplyは通常昇順に表示されるのがデフォルトですが追加プラグイン
bbpress sort topic replies
を使えば昇順を降順(新しい日付が最初)に変更することが可能です。
※設定については検索すると出てきますのでここでは省略します。(簡単です)

問題はトピックのReply数が数ページに渡った時。
bbpress のデフォルトでは新しい返信を投稿すると、一番大きいページ(最終ページ)に飛ぶという設定になっています。
正しくは「最終ページ+さっき投稿したID」

しかし昇順に変えた時は最初のページに新しい返信がつくので最後のページに飛ぶというのは挙動としてダメです。
以下で最初のページに飛ぶことが出来ます。

1.FTPで以下のファイルをダウンロードして下さい
wp-content\plugins\bbpress\includes\replies\functions.php

2.functions.phpテキストエディタで開いて下さい。

<?php
....
		// Allow to be filtered
 		$reply_url = apply_filters( 'bbp_new_reply_redirect_to', $reply_url, $redirect_to, $reply_id );
...
?>

438行目のこの箇所を

<?php
....
		// Allow to be filtered
		//修正前	$reply_url = apply_filters( 'bbp_new_reply_redirect_to', $reply_url, $redirect_to, $reply_id );
 		$reply_url = apply_filters( 'bbp_new_reply_redirect_to', $redirect_to );

...
?>

に変更してアップロードすればOK。
WordPressのアップデートがあった場合はわかりませんが、もし不具合が起きたときは//修正前~の行を復活させて下さい。
自己責任でお願いしますよ~

WordPressのbbpressで古いトピックを自動的にクローズにする方法

とても便利で有名なbbpressですが、日本での掲示板としての使い方であと一歩!といったところもありますよね。

 
その一つが、

手動でクローズにしない限り「永遠に返信ができちゃう」!

古いトピックを自動的にクローズにする
・最終更新がX日経過したものは自動でクローズ状態になる方法を紹介します。

とても簡単なのでWordPress初心者の方でも設定できると思います。

 

テキストエディタで新規作成、以下を記入して下さい。

<?php 

/*
Plugin Name: BBPress Close Old Posts
Description: Close BBPress 2.0+ posts that haven't been updated in X days. 
Author: meijiro
Version: 0.1
*/ 

register_activation_hook(__FILE__, 'bbpress_topic_scheduler');

add_action('bbpress_daily_event', 'bbpress_close_old_topics');

function bbpress_topic_scheduler() {
 wp_schedule_event(time(), 'daily', 'bbpress_daily_event');
}

function bbpress_close_old_topics() {
	// Auto close old topics
	$topics_query = array(
		'author' => 0,
		'show_stickies' => false,
		'parent_forum' => 'any',
		'post_status' => 'publish',
		'posts_per_page' => -1
	);
	if ( bbp_has_topics( $topics_query ) )
		while( bbp_topics() ) {
			bbp_the_topic();
			$topic_id = bbp_get_topic_id();
			$last_active = strtotime( get_post_meta( $topic_id, '_bbp_last_active_time', true ) );
			if ($last_active < strtotime( '-10 days') )
				bbp_close_topic( $topic_id );
		}
}
?>

デフォルトでは10日以上更新のないトピックは自動でクローズにすることになっていますので

if ($last_active < strtotime( '-10 days') )

の-10 daysを好きな日数に変更。

記入したらPHP形式で「close_old_topics.php」という名前で保存。
さらにclose_old_topicsというフォルダを作ってclose_old_topics.phpを入れる。

FTPでwp-content\plugins に入れます。
あとはWordPressダッシュボード/プラグインでclose_old_topicsを有効にすればOKです。

人狼が賑わっている

人狼にハマって6年・・・一時期は仕事もままならない程人狼のことしか考えられない状態でしたが、最近はめっぽう見る専です。人狼殺というアプリはすごく良かったんですが実況されていることがあり(人狼をプレイする人が増えることは嬉しい)、実況配信では公平なゲームにならないので萎えてしまいました。

それでも朝起きて一番最初に考えるのが人狼のことなので、一生人狼の虜なのかもしれません。昔人狼のせいで全く勉強が出来ずに浪人した人がいましたが、彼は今どうしているんだろう笑

 

数年前にウラナイトという言葉が流行っていたのですが、連続ガード無し・役欠け無しの条件でナイト(騎士)が占いを騙って21進行になった時、占いを一生守れるのでめちゃくちゃ強いという戦術を流行らした人がいました。

これにはリスクがあって、占いを騙っているナイトが自分の役を明らかにしないまま噛まれてしまった時に一方の占いが偽を追われてしまうので意味がない&人狼陣営に騎士騙りされる懸念から賛否両論ありました。

私はこういう新しい戦術や奇策を出すのはゲーム自体の発展としてすごく良いと思います。

 

それを踏まえて以前人狼殺にて9人村をやっていたときに、奇策と言えるかわかりませんが割と有効だったのでメモっておきます。

 

■9人村(狼2・占1・狂1・村3・騎1・ハンター1)

■初日占い有り/連続ガード無し

自分【狂人】のケース

 

初日 

3名が占いCO・・狼→真→狂人の順でCO

狼と真は白だし、狂人がグレーから【黒出し】

 

狂人の私が村に訴えたこと

占い師(本当は狂人)の私目線、占いCOしている残りの二名から1狼確定、グレーの狼1も見つけた事から狼2・狂人1の全人外露出した上でCOしたことを説明。9人4縄なので、私を吊っても村がミスらなければ勝ち確定ですということをお話しました。そして、私が黒出しした人以外の全員が白だと分かっている事を強調、残りの占いCOしている二人は確実に白のあなたたちの誰かに黒を打ってきます(じゃないと人外は勝てないので)と話しました。これは村陣営の人たちが黒を打たれるかもしれないという恐れを煽って私が味方であるということ刷り込んだつもりです。

 

村側の推理はこうなります。

私が狂人・・・狂人の3CO目はご主人様(狼)の足をひっぱる行動なので考え難い

私が狼・・・・全人外露出したということから一番最初にロラされるのに狼でそれをやるとは考え難い

→真目が高い

結果、初日私吊り、次の日に真占いが狼を見つけたにもかかわらず吊られ、狼を勝たせることが出来ました。

人狼ゲームの常識によって村は最後まで私の偽を追うことが出来なかったんですよね。

 

しかし、この戦術にはリスクが有り、誤爆していたら真占い師が村に2名いることになり高い確率で負けます笑

そして騎士に黒出ししていたらグレーにいる狼が対抗COしない限り私の偽が確定します。ハンターに黒を打ったらグレーの狼が対抗COするわけにも行かないのでハンターに誤爆した時点で私の偽が確定します。(ハンターが吊られても対抗狼を撃ち殺せるので)→ハンターって強すぎない?

つまり確実に3人の村人の中から黒を出さないといけない、危険な戦術ですね。たまたまうまくいったのですが、失敗して叩かれる勇気のある方は試してみてはいかがでしょうか笑 ハマると村はレアケを追わないといけなくなり、高い確率で勝ちにもっていけます。

逆にこういった盤面で真占い師が発言で真目を勝ち取れたりするとかっこいいですよね。