プロサンサーで使ったプラグインの一部紹介
※2020.2.20追記※
ここ最近リリースされた4.1.16ですが、回答ページをこっそりAMPに対応させるような感じがあったので4.1.15に戻しました。かなり不確かなんでアレですが、詳細がわかったら詳しく書きます。
※追記終わり※
※2020.4.20追記※
4.1.17にバージョンアップしましたが、特に問題ない模様。このまま使います。
日本語フィアルもそのまま使える模様
※追記終わり※
つーことで今回はバイク、クルマも工業系も全く関係なく、純粋なサイト制作でのwordpressのお話です。
興味のない方は面白そうな質問を管理人にぶつけてください。頼みます。あとくっそ長いです。
てなわけで、なんとかやりたい事に近づきつつあるプロアンサーですが、その中核をなすプラグイン、anspressについて久しぶりに書きたいと思います。
以前に書いたanspress関連の記事は↓となる
PRO-ANSWER.COM
wordpressプラグイン Anspressの日本語化
※2019.3.14追記※ 総まとめってわけでもないけど、現在まで何をやってきたかをanspress第三段として書きました。参考になるかと思いますんで読んでみて下さい。 …
続きを読む
PRO-ANSWER.COM
anspress の日本語化とか使い方を本気で書いてみる①
※2019.3.14追記※ 総まとめってわけでもないけど、現在まで何をやってきたかをanspress第三段として書きました。参考になるかと思いますんで読んでみて下さい。 …
続きを読む
PRO-ANSWER.COM
anspress の日本語化とか使い方を本気で書いてみる②
※2019.3.14追記※ 総まとめってわけでもないけど、現在まで何をやってきたかをanspress第三段として書きました。参考になるかと思いますんで読んでみて下さい。 …
続きを読む
バイク屋風情がどの面下げてプラグインの話なぞ…と思うかもしれないが、自分がどこをどういじったのかなんてすぐに忘れてしまうし、過去にたくさんの情報を残してきた先人達に習って管理人も微力ながらインターネットに情報を残しておきたいのである。誰かの助け(割とマイナーなプラグインなんで助けになるのは少ないかもしれないが)になれば幸いだと思う。
てことでまずは改めて日本語化ファイルのリンクを
anspress日本語化ファイル
基本的にほぼすべての内容が日本語化済み。現在(2019.3.13)での最新バージョンである4.1.15にほぼ対応出来ていると思う。使い方は適当に検索してください。絶対に管理人より上手な説明が速攻で見つかるはず。
ただどうでもいいところは結構適当に翻訳してあるし、割とふざけた部分(そもそも元の英語も結構ふざけてた部分があったりする。この手に相応しくないやたら詩的な文があったりさ。マジで翻訳する時に苦労するからやめていただきたい。でも詩的に翻訳しておいたんで、使っていれば出てくるかも)もある。
あと、基本的はプロアンサー上での使用しか考えていないため、場合によっては適切では無い言葉だったりもすると思うので、その辺は適当にやっつけてください。
今回の内容はすべて上記ファイルを使って日本語化した後ものをベースに書いていきます。
では本題に入ります。
まず、当サイトでの質問と回答の流れを書いていく。
その中で適当に説明していくよ。例として一つの質問を貼っておく。
キャブのOリングガスケット・ガスキャップ
まずは質問者、回答者共に会員登録となる。会員機能はwordpressの機能にまんま依存している。
ただし回答者は管理人が手動で登録(サイトの特性上しょうがない)するのでフロントからいじる必要はない。
質問者は質問者としてフロントから登録してもらっている。この機能はTheme My Loginの前のバージョンをちょこちょこイジって使用している。
会員登録が済むといよいよ質問が可能となるが、質問する人は質問しか出来ない。
これはanspressの機能に寄って可能。また、回答者以外は回答出来ないようにするのもanspressの標準機能で十分可能であるが、特定のカテゴリーに特定の回答者だけが答えられるようにするのは改造が必要(後述)となる。
で、anspressでは以下のような権限の管理をしている。
かなり多いが、そのほとんどをプロアンサーではつかっていない。
ちなみに質問者は…
ap_new_questionにチェックが入っているが、コレは質問スレ立てた人が自分のスレに回答を書き込めるようにするため。
で、回答者はこんな感じとなる。
更にAnsPressオプションの項目のユーザーアクセス制御を状況によって弄り倒す。
プロアンサーではコメント機能と画像アップロード機能を生かしてい無いので、それ関係はOFF。
作った質問に書き込むのはすべて回答という形にしており、回答を付けられるのは初めて質問を書き込んだ人と、そのカテゴリーに回答権を持つ回答者のみとなる。
質問と回答が済んだら、スレ立てた質問者は誰かにベストアンサーなるベッタベタの称号(変えよっかな…)を付与することにより、そのスレに終止符を打てるような設定となっている。
コレで質問と回答の流れは終了である。
参考にプロアンサーがどんな設定になっているのかを貼っておく。
読む権限の部分。質問や回答自体は読む人に制限は無いため、この状態。コメントは書き込みも許可していないので適当。
ここでの要は複数回答と質問者は回答できる?がONになっていること。コレにより回答権限を持つ人が何回も回答できるようにして、質問スレ立てた人も書き込めるようになっている。
ざっとこんな設定でプロアンサーは運営している。
ちなみにanspressは各ページに何を乗せるかをウィジェットを使って指定出来たりするんだけど…
となっており、ここには乗ってないけど更にお問い合わせフォーム、検索ウインドウ、質問、質問の統計などのウィジェットが用意されている。
いくらなんでも多すぎだろ、anspressさん…
で、あーでもこーでもとやり取りをする時に通知ってかメールはどうなっているか?
もちろん全く通知を動かさない事もできるが、プロアンサーでは次のようなときにメールが発射されるようになっている。
該当するカテゴリーの回答権限を持つユーザーにメールが行く。anspress非実装のため改造(後述)。ただしおそらくではあるが、登録している人全員に無差別にメールする機能はある。
質問した人にメールが飛んでく。anspress標準機能。ただしアドオンを有効にする必要あり。参照として過去ブロク
anspressの標準機能。選ばれた回答者にその旨がメールされる
と、こんなタイミングでメールで通知を発信している。
内容を変更するためにはメニューのアドオンからメール欄のオプションを選択する。あんまり選択項目がないんで見ればどんな機能かひと目でわかるはず。
発信されるメールはオプションのメールのテンプレートの項目から変更が可能になっている。
通知については現在の所はこんな条件で動かしている。将来的にはメール以外の方法や通知を受ける内容をもっと細かく選択できるようにする予定だ。
で、淡々と続きを書いていく。
ちなみに質問とか回答の画面で変更したのは表示の内容が殆どで、見た目とかはほとんど触っていなくてほぼanspress標準のまま。
管理人ぐらいのセンスだと多分コレ以上の見た目は作れないと思います…
まずは回答と質問の各ヘッダー部分↓
ここにユーザー情報の住所の一部とWEBサイトのリンクを生成している。
変更場所はテンプレートファイルをテーマ内に変更済みであればthemes\テーマ名\anspress\single-question.php、
回答のヘッダーは同ディレクトリのanswers.phpがそれに該当する。
その中で以下のような分がるが、これは通常であればコメント数などを表示するためにあるらしいが、プロアンサーでは使わないので
<span class="ap-comments-count"> <?php $comment_count = get_comments_number(); ?> <span itemprop="commentCount"><?php echo (int) $comment_count; ?></span> <?php printf( _n( 'Comment', 'Comments', $comment_count, 'anspress-question-answer' ) ); ?> </span>
これを…
<span class="ap-comments-count"> <a href="<?php echo the_author_meta('user_url2'); ?>" target="_blank">Webサイト</a> </span> <span class="ap-comments-count">所在地:<?php echo the_author_meta( 'user_prefectures'); ?><?php echo the_author_meta( 'user_municipality'); ?></span>
こんなふうに変更した。
ただし、コレだと質問者だろうが、回答者だろうが無差別に都道府県やWebサイトが表示されてしまう。
質問する人は上記情報は要らないし、出ないほうがより匿名性が高まるので、次のような記述追加するした。
<?php $roles = get_the_author_meta('roles'); if ($roles[0] == 'quser_1' ) { $posdt_roleon = 'style="display: none;"'; } else{ $posdt_roleon = '';} ?>
anspressでの投稿は全てカスタムフィールド?を使ったwordpress上のただの投稿なんで、get_the_author_metaで投稿者情報を引っ張ってくることができる。
ただし、このget_the_author_meta、メールアドレスとかそんなのだと平文でバーンっと引っ張って来てくれるんだけど、なぜか権限の時は素人の管理人には及びもつかない謎の文字列が一緒にはいってくるんで、[0]を付けて純粋な権限名だけを引っ張ってこれた。
後は消したい所にstyle="display: none;"を打ち込むだけである。
なぜそもそもSourceから消さないのかって言うと、将来的に実装する機能に恐らく必要になるため、どーしても残しておく必要があるから。
お次はプロフィール画面。
参照として管理人のプロフィール画面(///)を貼っておく。
疲れ果てているときに適当に書いたものなんで、今見ると…?となる部分もあるが、現在コレで正真正銘動いている。コレを見ているプロの方!そっと直してくれてもいいんですぜ…?
まぁいい。
こいつもテンプレの中にある。場所はthemes\テーマ名\anspress\anspress\addons\user\index.phpとなる。
でここをそらもういろいろ書き込んだような気がするんで、それをそのまま貼っておく。参考に…ならないかなー
<div class="ans_user_profile_main_container_main"> <h1><?php echo ap_user_display_name( [ 'user_id' => $user_id,] ); ?>さんのプロフィール</h1> <div class="ansuser_img"><?php echo get_avatar( $user_id,1000); ?> </div> <?php wp_social_bookmarking_light_output_e(null, get_permalink(), the_title("", "", false)); ?> <div class="ans_user_profile_main_container"> <div class="user_profile_left"> <p><?php echo ap_user_display_name( [ 'user_id' => $user_id,] ); ?>さんの紹介文</p> <p><?php echo get_user_meta( $user_id, 'description', true ); ?></p> <p style="margin: 0 0 0 3px;">プロアンサーからの紹介文</p> <p><?php echo get_user_meta( $user_id, 'adminpr', true ); ?></p> </div> <div class="user_profile_right"> <table> <tr> <th>住所</th> <td><?php echo get_user_meta( $user_id,'user_prefectures', true); ?><?php echo get_user_meta( $user_id,'user_municipality', true); ?><?php echo get_user_meta( $user_id,'ans_pref01', true); ?></td> </tr> <tr> <th>登録カテゴリー</th> <td><?php echo get_user_meta( $user_id,'ans_incategory1', true); ?></td> </tr> <tr> <th>得意分野</th> <td><?php echo get_user_meta( $user_id,'ans_incategory2', true); ?></td> </tr> <tr> <th>得意作業</th> <td><?php echo get_user_meta( $user_id,'ans_incategory3', true); ?></td> </tr> <tr> <th>営業時間</th> <td><?php echo get_user_meta( $user_id,'ans_businesshours', true); ?></td> </tr> <tr> <th>定休日</th> <td><?php echo get_user_meta( $user_id,'ans_Holiday', true); ?></td> </tr> <tr> <th>ウエブサイト</th> <td><a href="<?php echo the_author_meta( 'user_url', $user_id ); ?>" target="_blank"><?php echo the_author_meta( 'user_url', $user_id ); ?></a></td> </tr> <tr> <th>電話番号</th> <td><?php echo get_user_meta( $user_id,'ans_tel', true); ?></td> </tr> </table> </div> </div> <table class="anspress_list"> <tr> <th>回答数</th> <td><?php echo ap_total_posts_count( 'answer', false, $user_id )->total . "回"; ?></td> <th>質問数</th> <td><?php echo ap_total_posts_count( 'question', false, $user_id )->total . "回"; ?></td> </tr> <tr> <th>ベストアンサー数</th> <td><?php echo ap_total_posts_count( 'answer', 'best_answer' , $user_id )->total . "回"; ?></td> <th>獲得ポイント数</th> <td><?php echo ap_get_user_reputation($user_id) . "点";?> </td> </tr> </table> </div>
んで、当然この画面も質問者、回答者問わず表示される。
基本的に質問者には必要ない画面なんで、リンクを元から断つ方法も考えたが、万が一たどり着かれても困るし、なにより登録するプロフィール以外は別に表示されてても良いんじゃないかと思ったんで、例によって権限を読み取り表示、非表示をする部分を決めた。
まずは画面に表示されているのがどのIDなのかを確認、その後そのIDとの権限(Roles)を取り出して、質問者の権限名(quser_1)だったら…ってな感じにしてみた。
さっきの回答・質問のヘッダー部分とはちょっと(いやかなり)違うが、まぁ同じ権限名でも取り出し方が違うんで、こうなってしまった。もしかしたら同じ方法でもいけるんだろうなぁ…
$user_id = ap_current_user_id(); $current_tab = ap_sanitize_unslash( 'tab', 'r', 'questions' ); $userroles = get_userdata($user_id); $userroles1 = implode(',',$userroles -> roles ); ?>
取り敢えずこんなんで$userroles1に権限名をぶち込み、コレを条件に表示、非表示を決めた。
<?php if($userroles1 == 'quser_1'){echo '';} else{ ?> <div class="ansuser_img"><?php echo get_avatar( $user_id,1000); ?> </div> <?php wp_social_bookmarking_light_output_e(null, get_permalink(), the_title("", "", false)); ?> <?php ;} ?>
これはユーザーアバターの所。まぁ面倒なんでこんなざっくりした方法で根本的に非表示としている。この画面は通知実装に必要ないんで、完全なる非表示とした。
プロアンサーは新規質問は会員登録しなければ出来ない仕組みになっていて、これはanspressで権限を与えるか与えないかによって決まる。
この権限が無いと動作させられないページに迷い込んだ子羊をログイン画面や新規に誘導させるページがテンプレート内のlogin-signup.phpになる。
未ログインで新規質問を見たときに表示されるのがそれだ。
内容はまぁ適当に済ませてもいいと思うけど、ログインと未ログイン時の行き先は決めておいたほうがいいだろう。
その部分は
<div class="ap-login-buttons"> <a href="<?php echo esc_url( wp_registration_url( ) ); ?>"><?php esc_attr_e( 'Register', 'anspress-question-answer' ); ?></a> <span class="ap-login-sep"><?php esc_attr_e( 'or', 'anspress-question-answer' ); ?></span> <a href="<?php echo esc_url( wp_login_url( get_the_permalink() ) ); ?>"><?php esc_attr_e( 'Login', 'anspress-question-answer' ); ?></a> </div>
割と最後の方に書いてあるこの部分になる。
上例だと2行目と4行目になる。まぁここは結構自由に使えるんで、もっと適当にあそんでもいいのかもしれない。
プロアンサーではバイクならバイクの回答者、クルマならくるまの…ってなっている。
つまり、回答権限があっても答えられない質問があったりする。全部を乗せる事は出来ないけど、大体どんな感じでやってるかを紹介するよ。
まず、いじった場所は例によってテンプレファイル内にあるanswer-form.php。
こいつは何やってるかって言うと、質問に回答するための書き込み欄を表示させている。↓これね。
で、その質問がどのカテゴリーに該当するか、またログインユーザーは一体どんな権限グループに属するかを判断して表示させるかさせないかを決めています。
まず質問のカテゴリーを判断
$ajax_query = wp_json_encode( array( 'ap_ajax_action' => 'load_tinymce', 'question_id' => get_question_id(), ));
その後にどの権限グループがどの回答に答えられるかを決める。数値はanspressで決めたカテゴリーの番号となる。
権限グループはuser role editorで作ってる(もっと早く書いとけっての)で、それぞれを関連付けて…
$category_role_map = [ "administrator" =>"5,6,7,8", "quser_1" =>"", "quser_2" =>"", "auser_motocycs" =>"5", "auser_car" =>"6", "auser_weld" =>"7", "auser_peints" =>"8", "auser_motocycs_2" =>"5", "auser_car_2" =>"6", "auser_weld_2" =>"7", "auser_peints_2" =>"8" ];
で、ちょっと見せられないんですがいろいろ終わるまで回します。申し訳ない。
で、最後に条件が合えば表示させる感じです。
<?php if ( ( $is_self_q ) || ( ap_user_can_answer( $question_id ) && $hasAnswerAuthority ) ) : ?> <div style="margin-top: 30px;"> <label class="ap_answer_tnprete2" for="anshid">回答を書いてみる</label> <input type="checkbox" class="ap_answer_tnprete" id="anshid"> <div>
簡単にいうと権限グループと質問のIDと書き込んだ人を判断して、書き込みボタンを表示させるかさせないかって感じでやってます。割と乱暴な方法かなと。参考にしてください。
ちなみに今回もすべてのSourceを載せられない…ごめんなさい。
anapressにもメールを飛ばす機能は当然あるが、いまいち気が利かない。
プロアンサーでは質問があった場合に登録ユーザー全員ではなくそのカテゴリーの回答者にのみメールが行くようになっている。
いじったってか書き込んだのはfunctions.php。んで、anspressから飛ぶメールは質問した人に回答があった場合とベストアンサーが選択された時だけにしたかったのでこんな設定にする。
で、端折るけど
/* アクセス権限に対するユーザーの取得 */ $user_query = new WP_User_Query( array( 'role__in' => $roles ) ); $authors = $user_query->get_results(); if (!empty($authors)) { foreach ($authors as $author) { add_filter( 'wp_mail_content_type', 'set_html_content_type' ); $author_info = get_userdata($author->ID); $to = $author_info->user_email; $subject = "-プロアンサーより-新しい".$q_Categorys."が投稿されました。"; $headers = 'From: プロアンサードットコム <info@pro-answer.com>' . "\r\n"; $url = $post->guid; $body = ""; $body .= '<html>'; $body .= ' <head>'; $body .= ' <meta http-equiv="content-type" content="text/html; charset=UTF-8">'; $body .= ' </head>'; $body .= ' <body text="#000000" bgcolor="#FFFFFF">';
最後に
wp_mail( $to, $subject, $body, $headers );
とこんなです! 要するにanspressの機能に頼らず、質問の投稿があった場合
if($post->post_type=="question" )って感じで投稿が質問かどうかを判断にして、その後に誰にメールをやるか決める感じです。
コレもなんで機能としてないんだかわからないんだけど、anspressはタグをフリーに無差別につけることができる。
確かにカテゴリーがたくさんあったりもっと広域な情報を扱うサイトであればそれでもいいんだけど、当プロアンサー上では無限にタグが生成されても…って感じだったんでここに制限を設ける意味でもタグをチェック製にした。
こっちのほうが入力しやすいだろうしね!
で、どうするかって言うとまずはanspressのタグアドオンを有効にしてタグの使用を許可する。
そっから頑張って使用するであろうタグをすべて登録する。
ぶっちゃけコレが一番めんどくさかったようなきもするがまぁいい。
準備が出来たら例によってfunctions.phpへ。でもまた全部はみせられないんです…ごめんね。1
んでだ、まずシコシコ作ったタグをカテゴリーに関連付ける。
$category_tags1_maps = [ 5 => array(48,46,44,49,47,43,45,42), 6 => array(50,52,53,54,55,56,57,58,59,60,61,62), 7 => array(63,64,65,66,67,68,69), 8 => array(70,71,72) ]; $category_tags2_maps = ([ 5 => array(73,74,75), 6 => array(76,77,78), ]);
で、カテゴリーとタグが関連ついたらどれを元に各タグ一覧にLabelを貼って画面上でカテゴリー名と関連つけるよ!
// タグ名の生成 $html = ''; { $counter = 0; foreach( array_keys($category_tags1_maps) as $category_id ) { $html .= '<div id="category_area_id_' . $category_id . '" class="category_area_level1">'; // 第一レベルのタグ. { $tags_id_list = $category_tags1_maps[$category_id]; foreach($tags_id_list as $tags_id) { $arr = array('taxonomy'=>'question_tag','include' => $tags_id, 'hide_empty' => 0); $posttags = get_terms( $arr ); foreach($posttags as $tag) { $html .= '<label id="chkTagName_' . $tag->term_id . '"><input id="chkTag_' . $counter++ . '" type="checkbox" value="' . $tag->term_id . '" onclick="clickQuestionChechBoxTags(this)">' . $tag->name . '</label>'; } } }
んで、こうしたらjQueryつかってプルダウンメニューで得ればれたチェックボックスの群れをだし、選択するとanspressのフリーテキストエリアに文字がひりこまれる仕組みとしてみた。
まぁ使えるんだからいいんだよ!ね!ね?
多分いじった場所はこんなだったと思う。もちろんWidgetの設定やなんやらってのはやったと思うけどあんまり覚えていない…
必要がある人はもっといろんな機能があるのでやってみてください。
使っててなんじゃこりゃとか、明らかに変な部分を上げていく。
質問の一番頭に俺翻訳で「参考になった」的なボタンがあるんだけど、コレがどーも変。ボタン自体はhref="#"でクリッカブルにしてあるんだけど、そのAタグの中にクリック数の表示まで放り込んであった。
んで、こんなかんじで表示されてた
これじゃなにがなんだかわからんし、取り敢えず修正してみた。
ま、まぁセンスはともかく見やすくなったかと思う。
取り敢えずいじった場所は、本当はだめなんだろうが、wp-content\plugins\anspress-question-answer\includes\theme.phpの928行目後半にある
<a href="#" class="ap-btn ap-btn-subscribe ap-btn-small ' . ( $subscribed ? 'active' : '' ) . '" apsubscribe apquery="' . esc_js( $args ) . '">' . esc_attr( $label ) . '<span class="apsubscribers-count">' . esc_attr( $subscribers ) . '</span></a>';
を
<a href="#" class="ap-btn ap-btn-subscribe ap-btn-small ' . ( $subscribed ? 'active' : '' ) . '" apsubscribe apquery="' . esc_js( $args ) . '">' . esc_attr( $label ) . '</a><span class="apsubscribers-count">参考になった人 ' . esc_attr( $subscribers ) . '人</span>';
にしてCSSで適当に装飾した。
参考になった人とか人の部分は::beforeと::afterでかけばよかったんだろうが、どうせアプデの度に直すんなら一緒だろうと思い直接書き込む暴挙にでた。
で、この両方はログインしていないと出ない。でも折角いい数字なのにでれでも見れないのはもったいないって事でコレも強制的に表示させた。
場所はwp-content\plugins\anspress-question-answer\includes\hooks.phpの843行目。
コレを…
if ( is_user_logged_in() && is_question() && ap_is_addon_active( 'email.php' ) )
から
if ( is_question() && ap_is_addon_active( 'email.php' ) )
に変更した。まぁ早い話が表示条件のログインを消しただけである。これで表示はされるが、クリック件を持たないユーザーはanspressの機能により「参考になったボタン」を押せない仕様にできた。
※2019.5.18追記※
この機能、ログインしないと使えないしアドオンのメールを有効にしないと使えないからなんなんだと思って適当に使っていたんだけど、なんとこれクリックすると更新されたらメールが届く申込み機能でした…
ツー事でそれに合わせて記述を変更、翻訳Fileも更新しました。
追記終わり!
致命傷である。管理人だけの環境かもしれないが、サーバー、Localともに発現している。
方法は簡単、フロントから登録された質問をダッシュボード内のanspressから見るだけである。これだけで登録してもらったタグが飛ぶ。
もちろん見ただけで飛ぶもんだから、ダッシュボードから登録しても飛んでしまい登録不可となる。
原因はまだ調べていないけど、anspressってよりwordpressの問題のような気がしてならない…。分かり次第加筆する。
まぁよくあるアレなんであるが、こっちはサーバーのみで発現しているため完全なおま環だと思われる。
どこででてるかっていうとユーザープロフィール画面一番下の今までの回答ってところをクリックするとでる。
だれか助けてください!
※2019.4.9追記※
ただ単にデバックモードがオンになっているだけでした…。なぜローカルはOFFになっているのにサーバーだけONだったのか…誰かの陰謀としか思えない。追記おわり!
長くなったけどここまで!こんだけ書いとけばあとから見ても思い出せるだろう。そして書いている奴が全くの素人であるために見る人が見れば
こいつ、一体何と戦っているんだ…
と、思われるだろう。
まぁ、全体的に変な文章だったけど、誰かの参考になれば幸いですわ。今後も宜しくお願いします!
プロアンサーでは普段触りもしないブログの更新にヘロヘロになっちまったプロの方を募集中でーす!
お問い合わせからご連絡頂ければ返信しますんで、よければ登録してくださーい。