フォーラムへの返信

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    わぁ、kjmtshさんすみません…
    勿論お時間があって気の向いた時で大丈夫ですので。

    ありがとうございます。

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    ご返信ありがとうございます!!
    functionsだけでいいのですか、ありがとうございます、かしこまりました。

    そうですよね、そうですよね、ポストタイプの指定いらないですよね、書いてありますもんね。

    色々試してみたのですが
    1)単語を入力するとPageとPostと投稿タイプが引っかかるが、ユーザーメタでの検索が働いてない
    2)単語欄が未入力だとユーザーメタでの検索が無視されて、通常のPostのみがひっかかる

    といった感じなのです。
    既に投稿タイプを指定しているはずなのに引っかかるものが意図していないものだったので、改めてお伺いしたのです…。

    カスタム投稿タイプ名をpageにしたりしてみても結果が変わらないので、

    $where .= ” AND (p.post_type = ‘{$post_types}’ AND p.post_status = ‘{$post_status}’)”;

    を試しに直接
    $where .= ” AND (p.post_type = ‘カスタム投稿タイプ名’ AND p.post_status = ‘{$post_status}’)”;

    にしてみても上手くいかなかったのです。

    すみません、私がいけないのかもしれないので、色々触ってみますが、もし思い当たるフシがありましたらご協力いただけませんでしょうか…頼ってしまってすみません…

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    こんにちは。
    kjmtshさん、度々ありがとうございます。

    すみません、ご報告?ご相談?なのですが、
    一番最後に書いて頂いたコードでちょっとエラーが出てしまっていたので(波括弧とか、セミコロンとかでした)エラーが出ないようにしてみたのですが、
    検索をしても上手く動いていないみたいで、ちょっと困っております…。

    以下、コードです。
    ————————————————————-

    【functions.phpに記載してあるもの】

    if (isset($_GET['my_nonce']) && wp_verify_nonce($_GET['my_nonce'], 'my_search')) {
        if (isset($_GET['address']) && $_GET['address'] != 'none') {
            function replace_search_template($template) {
            return locate_template(array('search.php'));
            }
            add_filter('template_include', 'replace_search_template', 99);
            search_with_usermeta();
        }
    } elseif (isset($_GET['address'])) {
        if (!isset($_GET['my_nonce']) || !wp_verify_nonce($_GET['my_nonce'], 'my_search')) {
            echo 'This operation is not allowed on this server';
            exit;
        }
    }
    function search_with_usermeta() {
        global $wpdb, $wp_query;
    
        $query_strings = $_GET['s'];
        $post_types    = "('カスタム投稿タイプ名')";       // 投稿タイプ 複数指定可
        $post_status   = "publish";        // 投稿ステータス See WP_Query manual
        $address       = urldecode($_GET['address']); // 住所 meta_value の値に使う
        $meta_key      = "address";            // wp_usermeta の meta_key フィールド名
        $limit         = 5;                // 1ページに表示する投稿数
        $where         = '';
    
        $query_strings = stripslashes($query_strings);
        if (empty($query_strings)) {
            $search_terms = array('');
        } else {
            $query_strings = urldecode($query_strings);
            $query_strings = str_replace(array("\r", "\n"), '', $query_strings);
            if (preg_match_all('/".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+/', $query_strings, $matches)) {
                foreach ($matches[0] as $match) {
                    if (preg_match('/^".+"$/', $match)){
                        $search_terms[] = trim($match, "\"'");
    				} else {
                        $search_terms[] = trim($match, "\"' ");
    				}
                }
                if (empty($search_terms)) {
                    $search_terms = array($query_strings);
                }
            } else {
                $search_terms = array($query_strings);
            }
        }
        foreach ($search_terms as $term) {
            $term = like_escape(esc_sql($term));
            $where .= " AND ((p.post_content LIKE '%{$term}%') OR (p.post_title LIKE '%{$term}%'))";
        }
        $where .= " AND (p.post_type IN $post_types AND p.post_status = '{$post_status}')";
        $where .= " AND (um.meta_key = '{$meta_key}' AND um.meta_value = '{$address}')";
        $sql = "SELECT * FROM $wpdb->posts AS p
            LEFT JOIN $wpdb->usermeta AS um
            ON p.post_author=um.user_id
            WHERE 1=1 $where
            ORDER BY p.post_date DESC
            LIMIT $limit";
        $args = array(
            'query'          => $sql,
            'posts_per_page' => $limit,
            'paged'          => get_query_var('paged')
        );
        unset($wp_query);
        $wp_query = new WP_Query($args);
    }

    【検索フォーム】(value部分に該当する値はユーザーメタに入れてあります)

    <form role="search" id="searchform" method="GET" action="<?php echo home_url('/'); ?>">
        <label for="s">Search for:</label>
        <input type="text" value="" name="s" id="s" />
        <label for="address">Address</label>
        <select name="address">
            <option value="none">none</option>
            <option value="関東">関東</option>
            <option value="東北">東北</option>
        </select>
        <input type="submit" id="searchsubmit" value="Search" style="display:inline;" />
        <?php wp_nonce_field('my_search', 'my_nonce'); ?>
    </form>

    【繰り返し部分】(テストの仮のものです)

    <?php $my_posts = search_with_usermeta();?>
    <?php foreach ($my_posts as $post) : : ?>
    <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
    <?php endforeach; ?>

    —————————————————————–

    すみません、お忙しいとは思うのですが、お伺いしたい点がいくつかありまして…。

    1)カスタムポストタイプの指定はform部分でする必要は無い?
      functions.phpの時点で指定しているので大丈夫、という事でしょうか?

    2)繰り返し部分についてなのですが、上記の書き方で合ってるでしょうか?
     現在使用しているテーマのsearch.phpが、

    <?php if ( have_posts() ) : ?>
    	<?php while ( have_posts() ) : the_post(); ?>
    		<?php get_template_part( 'content', 'search' ); ?>
    	<?php endwhile; ?>
    <?php else : ?>
    	<?php get_template_part( 'no-results', 'search' ); ?>
    <?php endif; ?>

    となっていて、色々トライしてcontent.phpの方に書いてみてもsarch.phpに書いてみても上手く表示ができず…。

    本当にすみません、今一度お教え頂いてもよろしいでしょうか…?
    何卒よろしくお願いします。

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    返信が遅くなり申し訳ございません。
    大変後丁寧に検索部分の解説、ソースコードを書いて頂くことまでしていただき、ありがとうございます!

    このフォーラムには大変お優しい方ばかりいらっしゃって、本当に感謝しております。

    ・search everythingの停止の件につきまして
    タクソノミーや著者で絞り込みたいと思い使用していましたが、
    [s]部分では上記を検索する事は無いと後ほど気づき、search everythingを停止しても無事に絞り込みが出来ておりました。
    (そもそも、タクソノミーや著者の絞り込み(検索で使用できるパラメータのauthorやcat)は、このプラグインでないと出来ないと勘違いしておりました)
    ですので、捨ててしまって全く問題ございませんでした。ご報告できておらず、申し訳ございません…。

    解説いただいた事につきましては、

    1)デフォルトの検索はタイトルと本文だけ

    2)このままだとデフォルトの検索も含んじゃってるから、そっちは止めないとダメ

    3)[s]でユーザーメタをキーにして検索できるようにする、wpdbから直接どの値を持ってくるか指定

    という3段階の理解が、私のやりたい事を実現するには必要だったという事。

    ※search everythingのu.display_nameの所は単純にwp_usermetaに変えても動かないよ
    ※search everythingだとデフォルトの検索も入るからやっぱり止める必要があるよ

    という解説をして頂いた、という認識で合っておりますでしょうか…?

    頂いたソースコードをトライし、ご報告するのが直近で月曜日になってしまいますが、
    必ずご報告いたしますね。

    ありがとうございます。

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    試行錯誤して行ったり来たりしてしまっています…。

    お教え頂いたとおり、外に出してみました。

    複数ユーザーの情報がとれるようになったのですが、検索の文字列が入ると他の検索条件が完全に無視されてしまいました…。

    (カスタムタクソノミーの指定や、authorの指定をしております)

    function custom_search($where, $wp_query) {
    	//検索
    	global $wpdb;
    	$s = get_query_var('s');
    	if( is_search() ) {
    		$users = $wpdb->get_results("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'aim' AND meta_value LIKE '%$s%'");
    		foreach ($users as $user){
    			$user_id = $user->user_id;
    
    		}
    		$where .= "OR post_author = $user_id AND post_type = 'カスタム投稿タイプ' AND post_status = 'publish' ";
    	}
    
    	//query['s']があったら検索ページ表示
    	if (isset($wp_query->query['s'])) {
    		 $wp_query->is_search = true;
    	}
    
    	return $where;
    }
    add_filter('posts_where','custom_search', 10, 2);

    なお、検索時のURLは以下のようになります。

    http://URL/?post_type=カスタム投稿タイプ名&author=16&cat=カテゴリー名&s=検索文字列

    検索文字列が入らなければ無事に他の条件はAND検索になるのですが、
    検索文字列が入ると
    (カスタム投稿タイプ名 AND author AND カテゴリー名) OR (検索文字列に当てはまる投稿)
    のように動いております。

    単純に
    $where .= “OR post_author = $user_id
    のORをANDに変えてもダメだったのは何故なのでしょうか?

    頼りにしてしまって申し訳ございません…勉強不足なのは承知ですが、お助け下さい‥。

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    ありがとうございます!ありがとうございます!!
    無事、複数結果が出ても表示されるようになりました。

    gogowebさん、本当に、色々とありがとうございました。

    function custom_search($where, $wp_query) {
    global $wpdb;
    $s = get_query_var(‘s’);
    if( is_search() ) {
    $users = $wpdb->get_results(“SELECT user_id FROM $wpdb->usermeta WHERE meta_key = メタキー名’ AND meta_value LIKE ‘%$s%'”);

    foreach ($users as $user){
    $user_id = $user->user_id;
    $where .= “OR post_author = $user_id AND post_type = ‘カスタム投稿タイプ名’ AND post_status = ‘publish'”;

    }
    }

    return $where;
    }
    add_filter(‘posts_where’,’custom_search’, 10, 2);

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    何度もすみません…。

    頂きましたコードですが、無事に動いた!
    と思ったのですが、例えば関東に住む人間が2人いた場合Not foundになってしまったので、頂いたコードを色々試させて頂いて以下のようにしてみました。

    function custom_search($where, $wp_query) {
    	//検索
    	global $wpdb;
    	$s = get_query_var('s');
    	if( is_search() ) {
    		$users = $wpdb->get_var("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'メタキー名' AND meta_value LIKE '%$s%'");
    
    		$where .= "OR post_author = $users AND post_type = 'カスタム投稿タイプ名' AND post_status = 'publish'";
    
    	}
    
    	return $where;
    }
    add_filter('posts_where','custom_search', 10, 2);

    上記でNot foundではなくなったのですが、1人分のみ表示されます。

    print_r($wpdb->last_result);でsqlのデータを確認した所、無事に複数件のユーザーIDは取れておりましたので、foreachで$usersをどうにかするのかしら、とは思っているものの、色々試しても上手く表示させることが出来ません…。

    何度も申し訳ございませんが、詳しい方がご覧になられていましたら、どうかお助け頂きたく…。宜しくお願いいたします。

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    勿論変更してるのです…。

    他の自分で追加してみたメタキーにしてみたり、キーの名前自体を変えてみたりしてみたのですが、結果は自分で追加したものだけ引っ掛けることが出来ませんでした。

    とりあえず、使用していないaimというキーに仮で値を入れたら引っ掛けることができたので、
    aimというキーのの見た目上の表記を住所としました。

    gogowebさんのおかげで、無事に希望していた挙動が実現しております。

    大変ご丁寧に色々とありがとうございます、何日も困っていたのでお助け頂き本当に嬉しいです。本件、解決とさせて頂きます。

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    ありがとうございます、ありがとうございます!
    助けて頂けて本当に嬉しいです!!

    ご親切に、functionsに入れればいいようにコードまで書いて頂きまして、ありがとうございます。

    早速試してみました。
    試しにキーをdescriptionにしてみたところ、これがバッチリでした!!!

    が、何故か自分で追加したユーザーメタだと検索に引っかからず…。

    ——————————————–

    // 管理画面のユーザーに項目追加
    function update_profile_fields( $contactmethods ) {
    	$contactmethods['address'] = '住所';
    	return $contactmethods;
    }
    add_filter('user_contactmethods','update_profile_fields',10,1);

    ——————————————–

    上記のように、よく検索で引っかかるやり方で項目を追加しているのですが、
    これがいけないのでしょうか?

    (いっそもうdescription欄をaddressとしてしまおうか…)

    引き続き自分でも色々試してみますが、もしお手すきでしたらご助力頂けますととても嬉しいです。

    フォーラム: 使い方全般
    返信が含まれるトピック: 投稿を【ユーザーメタデータ】で検索したい
    トピック投稿者 temina

    (@temina)

    早速の返信ありがとうございます!!

    Search Everythingというプラグインの中で投稿をユーザーで検索できており、

    $search .= “{$searchand}(u.display_name LIKE ‘{$n}{$term}{$n}’)”;

    とあったので試しに

    $search .= “{$searchand}(u.user_email LIKE ‘{$n}{$term}{$n}’)”;

    とやったらメールアドレスでの検索が可能でした。
    ですが、get_the_author_metaのパラメータで任意のキーってできませんよね…?

    ————————-

    頂いたヒントから、
    $wpdb->usermeta WHERE meta_key=’キー名’
    で上手くイケばいいなと思ったのですがダメでした。

    すみません、言い訳するのもアレですが、本当に初心者で色々試してはおりますが、もうどうしたらいいのか…。

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