notenotennoote
フォーラムへの返信
-
フォーラム: 使い方全般
返信が含まれるトピック: 記事の存在を確認する方法こんにちは。お世話になっております。
詳しくありがとうございます。気を付けたいところを教えていただきすっきり致しました。フォーラム: 使い方全般
返信が含まれるトピック: esc_html() の配列バージョンを作りたい@munyagu様、@ishitaka様
ご忠告くださったお二方にまずは感謝申し上げます。
どうもありがとうございます。ユーザー投稿型サイトを作るにあたって、本文や検索バーでAJAXを使う予定です。
たとえば下記コードは投稿のフローですが、不安点など見えますでしょうか?※動くことは確認できているので「コードがあってるかどうか見てくれ」ではなくて、「こういうフローで注意すべきこと」や「
esc_html()
以外に通すべき関数」などをお伺いできましたら幸いです。// AJAX add_action( 'wp_ajax_get_data', 'get_data' ); function get_data() { // 入力値をエスケープ $arr = esc_arr( $_POST['arr'] ); // $post_type, $post_title, $post_content, $term_name_arr が展開 extract( $arr ); // 投稿タイプはどちらかのみOK if( $post_type != 'custom1' && $post_type != 'custom1' ) die(); // タイトルは必須で50文字以内OK if( ! empty( $post_title ) ) { $post_title_mblen = mb_strlen($post_title); if( ! $post_title_mblen || $post_title_mblen > 50 ){ die(); } } else{ die(); } // 本文はもしあれば1000文字以内OK if( ! empty( $post_content ) ) { $post_content_mblen = mb_strlen($post_content); if( ! $post_content_mblen || $post_content_mblen > 1000 ){ die(); } } // 投稿 $my_post = array( 'post_title' => $ttl', 'post_content' => $content, 'post_type' => $post_type', 'post_status' => 'publish', 'post_author' => get_current_user_id(), ); $insert_id = wp_insert_post( $my_post ); // タームを登録 if( ($insert_id) && !is_wp_error($insert_id) ) { // タームIDを取得 $book_id_arr = my_insert_terms( 'book', $term_name_arr ); // 登録 wp_set_object_terms($insert_id, $book_id_arr, 'book' ); } } // タームIDを取得 function my_insert_terms( $taxonomy, $term_name_arr ){ /* タームがあればIDを返し、なければ登録して返す @param $taxonomy : 'book'のみ $term_name_arr : ユーザーが投稿したターム名の配列 @return $book_id_arr : 'book'のタームIDの配列 */ if( $taxonomy=='book' ){ $parent_book = term_exists( 'en', 'book' ); $book_id_arr = []; foreach( $term_name_arr as $term_name ){ // 既存ならそのままタームのデータを取得 $book_data = term_exists( $term_name, 'book', 'en' ); // もしなければタームを登録 if( !$book_data ){ $book_data = wp_insert_term( $term_name, 'book', array( 'parent'=> $parent_book["term_id"] ) ); } // タームのlIDを取得 $book_id_arr[] = intval( $book_data['term_id'] ); } return $book_id_arr; } } // 入力値をエスケープ function esc_arr( $arr ) { return filter_var( $arr, FILTER_CALLBACK, ["options" => function( $v ) { return esc_html( $v ); }] ); }
@ishitaka様
便利なfilter_var
に感動しました。上記の通り使わせて頂きたいと思います。
いつも便利な書き方をありがとうございます。フォーラム: 使い方全般
返信が含まれるトピック: AJAXの実行中にページURLを取得する方法ありがとうございます。そう致します。
それにしてもそちら便利ですね。今までURLからのID取得は
get_page_by_path()
を使っていて、でもこれは引数に投稿タイプ名が必要だから困る…というシーンが結構多かったのですけど、url_to_postid()
なら投稿タイプ名が不要ですね。(投稿タイプを指定しない分、取得に時間がかかるのでしょうか?)良いことを知りました。ありがとうございます。:)
- この返信は5年、 5ヶ月前にnotenotennooteが編集しました。
フォーラム: 使い方全般
返信が含まれるトピック: AJAXの実行中にページURLを取得する方法ありがとうございます。勉強になりました。
これひょっとしたら
is_page()
やis_singular()
なども判定ききませんよね?そうしましたら、たとえば
is_singular()
なら$url = esc_html( $_POST['url'] ); $page = explode('/',$url)[3]; if( $page=='customposttype1' ){ } elseif( $page=='customposttype2' ){ }
のような方法でしょうか?
フォーラム: 使い方全般
返信が含まれるトピック: 「ユーザー情報」を「カスタム投稿タイプ」として管理する方法の問題点について>ソート順によってユーザー情報が 11 件目以降であった場合、ユーザー情報は1つも取れません。
はい、ユーザーとカスタム投稿を混ぜて検索したかったので、これは問題ではないという認識でした。>そのような検索結果を何に使うのか想像が出来ません。
Twitterでいうタイムラインのようなもので、たとえば「Aさんが”mypost”を投稿しました」とか「新しくBさんが登録しました」などを考えています。>投稿とユーザー情報を入り混じらせて表示させるということでしょうか?
イエスです。上のタイムラインのような感じが前提でした。ありがとうございました。ズレがあったとはいえ、「>圧倒的少数のユーザーを入れてユーザー情報を抽出するコストを上げるくらいなら…」というアドバイスは特に参考になりました。やはり仰るように
WP_Query
とWP_User_Query
の2つを使うこともアリかもしれません。引き続き検討したいと思います。ご返信に深く感謝申し上げます。
フォーラム: 使い方全般
返信が含まれるトピック: 「ユーザー情報」を「カスタム投稿タイプ」として管理する方法の問題点についてご返信ありがとうございます。大変申し訳ございませんが、以下【1】から【4】までご一読頂いてもよろしいでしょうか。
【1】
>そのように呼ぶとは思いませんでしたその呼び方はおかしかったでしょうか?「”mypost” の取得とユーザーの取得」または「”mypost” の取得と “user” の取得」というと、その呼び方しか知りませんで…
【2】
>一覧表示する場合は表示件数 10 件や投稿者、検索キーワードなどの絞り込みが必要かと思いますが、ユーザー情報のカスタム投稿を同じ条件で絞り込むことが出来ないと思いますがまず表示件数についてですけど、絞り込みできないのはなぜですか?
'posts_per_page'=>10
でいけませんでしょうか?あと検索キーワードについては、”user” と “mypost” に同じキーで検索用のカスタムフィールドを作り、それを
'meta_query'=>array(array('key'=>キー));
のように検索対象にしようと考えていますが、これも絞り込みできないでしょうか?または問題ありそうでしょうか?【3】
>データのうち一番数が多くなるのが post かと思いますがなるほど!たしかに仰る通りですね。ただ
WP_Query
とWP_User_Query
の2つにわけてしまうと、【4】のソートや、ページネーションが実装できないのではないかとも思っています。【4】
>「他の視点」についてはちょっと意味が分かりませんでした。要はユーザーと “mypost” とをあわせて、最新順で表示したいということです。
ユーザーならば登録日が新しい順で、”mypost” ならば投稿日が新しい順で、ということです。このソートをするにあたって、
WP_Query
とWP_User_Query
の2つを使った後でのソートになると、ユーザーは登録日を見て、”mypost” は投稿日を見て、それらについてソートし直す手間が必要かと思います。そこでユーザーの登録と同時に “user” を投稿すれば、2つを使わずに
WP_Query
だけで'orderby'=>'date'
とできます。
これで “user” と “mypost” のいずれも投稿日でソートできますから、この手間が回避できるように考えています。以上長文で大変恐縮ではございますが、ご考察、ご返信頂けましたら幸いです。
フォーラム: 使い方全般
返信が含まれるトピック: 「ユーザー情報」を「カスタム投稿タイプ」として管理する方法の問題点についていつもありがとうございます。
そうなのですか?次のようにカスタム投稿タイプとして呼び出しをまとめられるので、これを指して1回分で済むというイメージでした。
【ユーザー情報をカスタム投稿タイプで管理した場合】
//1回で二つとも呼べる $args = array( 'post_type' = array('mypost','user'), 'post__in' = array('100,200,1,2'), ); $the_query = new WP_Query( $args );
【普通の場合】
// 1回目にカスタム投稿タイプを呼ぶ $args = array( 'post_type' = array('mypost'), 'post__in' = array('100,200'), ); $post_query = new WP_Query( $args ); // 2回目にユーザーを呼ぶ $args = array( 'include' => array('1,2'); ); $user_query = new WP_User_Query( $args );
上は結局同じコストなのでしょうか?
それでは、他の視点として、検索結果として使うことを考えるといかがでしょうか?
たとえば「ユーザー登録日」と「カスタム投稿タイプの投稿日」とを合わせてソートし、検索結果として順に表示する。などです。
こういったケースでは上の【普通の場合】は少し面倒に感じるのですが。(それぞれ読んでから日付でソートし直さないといけないのではないかと。)フォーラム: 使い方全般
返信が含まれるトピック: 通知システムとデータベースについてご返信ありがとうございます。
すると【3】のような独自テーブルを作るスキルがないことを前提に考えると、【1】の保存形式を「>日付項目を含むシリアライズした配列データで保持」とし、あとは件数を100件まで、のように限定するのがよさそうですね。わざわざ投稿する【2】だと1件ごとのスラッグとか無駄な情報が多いですもんね。ぼんやり見えてきました。
フォーラム: 使い方全般
返信が含まれるトピック: 通知システムとデータベースについて少ない情報の中でお付き合いいただき誠にありがとうございます。
たしかに選択肢を把握したかったかもしれません。
そしてなるほど、通知のデータ管理のやり方としては
【1】Bさんのカスタムフィールドに対して更新を行うプラン
【2】投稿タイプnotificationを投稿するプラン
【3】教えて頂いた、独自のテーブルを作って更新するプラン
がある感じですね。実際どの通知プラグインも【3】でした。
疑問なのですけど、【3】より【1】の方が、取得が早くないでしょうか?
というのは、【1】は一人のカスタムフィールドを覗くだけなのに対して、【3】は独自テーブルからいくつかのカラム(ロウ?よくわかりませんが…)をつなげたりして取得しないといけないので、なら【1】の方がいいのではないかと思っています。
もちろんどのプラグインでも【3】なので、やはり @munyagu さんの仰る通り【3】がベストなのだとは思いますが、それはなぜなのでしょうか?
フォーラム: 使い方全般
返信が含まれるトピック: 通知システムとデータベースについてこんにちは
ご返信ありがとうございます。なるほど、要件ですか。実はTwitterを作ろうとしています。なので通知内容は一緒で、ただあまりデータベースを圧迫するようならば1か月間だけとか、または100件までのような制限を設けようかと思っています。なので具体的な要件は決まっておらず、Twitterのようなものならばどのような設計がいいのか、という質問です。
・目的はTwitterと同様で、フォローやいいねや記事の投稿(ツイート)を通知する
・件数は未定
・期間も未定
といった感じで、どうしようか考えている状況です。