フォーラムへの返信

10件の返信を表示中 - 16 - 25件目 (全25件中)
  • フォーラム: 使い方全般
    返信が含まれるトピック: 記事の存在を確認する方法
    トピック投稿者 notenotennoote

    (@notenotennoote)

    こんにちは。お世話になっております。
    詳しくありがとうございます。気を付けたいところを教えていただきすっきり致しました。

    フォーラム: 使い方全般
    返信が含まれるトピック: esc_html() の配列バージョンを作りたい
    トピック投稿者 notenotennoote

    (@notenotennoote)

    @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を取得する方法
    トピック投稿者 notenotennoote

    (@notenotennoote)

    ありがとうございます。そう致します。

    それにしてもそちら便利ですね。今までURLからのID取得はget_page_by_path()を使っていて、でもこれは引数に投稿タイプ名が必要だから困る…というシーンが結構多かったのですけど、url_to_postid()なら投稿タイプ名が不要ですね。(投稿タイプを指定しない分、取得に時間がかかるのでしょうか?)

    良いことを知りました。ありがとうございます。:)

    • この返信は4年、 8ヶ月前にnotenotennooteが編集しました。
    フォーラム: 使い方全般
    返信が含まれるトピック: AJAXの実行中にページURLを取得する方法
    トピック投稿者 notenotennoote

    (@notenotennoote)

    ありがとうございます。勉強になりました。

    これひょっとしたらis_page()is_singular()なども判定ききませんよね?

    そうしましたら、たとえばis_singular()なら

    
    $url = esc_html( $_POST['url'] );
    $page = explode('/',$url)[3];
    if( $page=='customposttype1' ){
    }
    elseif( $page=='customposttype2' ){
    }

    のような方法でしょうか?

    トピック投稿者 notenotennoote

    (@notenotennoote)

    >ソート順によってユーザー情報が 11 件目以降であった場合、ユーザー情報は1つも取れません。
    はい、ユーザーとカスタム投稿を混ぜて検索したかったので、これは問題ではないという認識でした。

    >そのような検索結果を何に使うのか想像が出来ません。
    Twitterでいうタイムラインのようなもので、たとえば「Aさんが”mypost”を投稿しました」とか「新しくBさんが登録しました」などを考えています。

    >投稿とユーザー情報を入り混じらせて表示させるということでしょうか?
    イエスです。上のタイムラインのような感じが前提でした。

    ありがとうございました。ズレがあったとはいえ、「>圧倒的少数のユーザーを入れてユーザー情報を抽出するコストを上げるくらいなら…」というアドバイスは特に参考になりました。やはり仰るようにWP_QueryWP_User_Queryの2つを使うこともアリかもしれません。

    引き続き検討したいと思います。ご返信に深く感謝申し上げます。

    トピック投稿者 notenotennoote

    (@notenotennoote)

    ご返信ありがとうございます。大変申し訳ございませんが、以下【1】から【4】までご一読頂いてもよろしいでしょうか。

    【1】
    >そのように呼ぶとは思いませんでした

    その呼び方はおかしかったでしょうか?「”mypost” の取得とユーザーの取得」または「”mypost” の取得と “user” の取得」というと、その呼び方しか知りませんで…

    【2】
    >一覧表示する場合は表示件数 10 件や投稿者、検索キーワードなどの絞り込みが必要かと思いますが、ユーザー情報のカスタム投稿を同じ条件で絞り込むことが出来ないと思いますが

    まず表示件数についてですけど、絞り込みできないのはなぜですか?'posts_per_page'=>10でいけませんでしょうか?

    あと検索キーワードについては、”user” と “mypost” に同じキーで検索用のカスタムフィールドを作り、それを'meta_query'=>array(array('key'=>キー));のように検索対象にしようと考えていますが、これも絞り込みできないでしょうか?または問題ありそうでしょうか?

    【3】
    >データのうち一番数が多くなるのが post かと思いますが

    なるほど!たしかに仰る通りですね。ただWP_QueryWP_User_Queryの2つにわけてしまうと、【4】のソートや、ページネーションが実装できないのではないかとも思っています。

    【4】
    >「他の視点」についてはちょっと意味が分かりませんでした。

    要はユーザーと “mypost” とをあわせて、最新順で表示したいということです。
    ユーザーならば登録日が新しい順で、”mypost” ならば投稿日が新しい順で、ということです。

    このソートをするにあたって、WP_QueryWP_User_Queryの2つを使った後でのソートになると、ユーザーは登録日を見て、”mypost” は投稿日を見て、それらについてソートし直す手間が必要かと思います。

    そこでユーザーの登録と同時に “user” を投稿すれば、2つを使わずにWP_Queryだけで'orderby'=>'date'とできます。
    これで “user” と “mypost” のいずれも投稿日でソートできますから、この手間が回避できるように考えています。

    以上長文で大変恐縮ではございますが、ご考察、ご返信頂けましたら幸いです。

    トピック投稿者 notenotennoote

    (@notenotennoote)

    いつもありがとうございます。

    そうなのですか?次のようにカスタム投稿タイプとして呼び出しをまとめられるので、これを指して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 );

    上は結局同じコストなのでしょうか?

    それでは、他の視点として、検索結果として使うことを考えるといかがでしょうか?
    たとえば「ユーザー登録日」と「カスタム投稿タイプの投稿日」とを合わせてソートし、検索結果として順に表示する。などです。
    こういったケースでは上の【普通の場合】は少し面倒に感じるのですが。(それぞれ読んでから日付でソートし直さないといけないのではないかと。)

    フォーラム: 使い方全般
    返信が含まれるトピック: 通知システムとデータベースについて
    トピック投稿者 notenotennoote

    (@notenotennoote)

    ご返信ありがとうございます。

    すると【3】のような独自テーブルを作るスキルがないことを前提に考えると、【1】の保存形式を「>日付項目を含むシリアライズした配列データで保持」とし、あとは件数を100件まで、のように限定するのがよさそうですね。わざわざ投稿する【2】だと1件ごとのスラッグとか無駄な情報が多いですもんね。ぼんやり見えてきました。

    フォーラム: 使い方全般
    返信が含まれるトピック: 通知システムとデータベースについて
    トピック投稿者 notenotennoote

    (@notenotennoote)

    少ない情報の中でお付き合いいただき誠にありがとうございます。

    たしかに選択肢を把握したかったかもしれません。
    そしてなるほど、通知のデータ管理のやり方としては
    【1】Bさんのカスタムフィールドに対して更新を行うプラン
    【2】投稿タイプnotificationを投稿するプラン
    【3】教えて頂いた、独自のテーブルを作って更新するプラン
    がある感じですね。

    実際どの通知プラグインも【3】でした。

    疑問なのですけど、【3】より【1】の方が、取得が早くないでしょうか?

    というのは、【1】は一人のカスタムフィールドを覗くだけなのに対して、【3】は独自テーブルからいくつかのカラム(ロウ?よくわかりませんが…)をつなげたりして取得しないといけないので、なら【1】の方がいいのではないかと思っています。

    もちろんどのプラグインでも【3】なので、やはり @munyagu さんの仰る通り【3】がベストなのだとは思いますが、それはなぜなのでしょうか?

    フォーラム: 使い方全般
    返信が含まれるトピック: 通知システムとデータベースについて
    トピック投稿者 notenotennoote

    (@notenotennoote)

    こんにちは

    ご返信ありがとうございます。なるほど、要件ですか。実はTwitterを作ろうとしています。なので通知内容は一緒で、ただあまりデータベースを圧迫するようならば1か月間だけとか、または100件までのような制限を設けようかと思っています。なので具体的な要件は決まっておらず、Twitterのようなものならばどのような設計がいいのか、という質問です。
    ・目的はTwitterと同様で、フォローやいいねや記事の投稿(ツイート)を通知する
    ・件数は未定
    ・期間も未定
    といった感じで、どうしようか考えている状況です。

10件の返信を表示中 - 16 - 25件目 (全25件中)