Wordpressのループについて教えてください。

投稿に緯度経度のフィ-ルドを作り、店舗情報としてマップにマ-カ-で配置しております。

さらに、ユ-ザ-に会員有効期限というカスタムフィ-ルド(membership_date)を設定しました(postではなくユ-ザ-のカスタムフィ-ルドです)。
ル-プの中で投稿者(ユ-ザ-)のカスタムフィールド(membership_date)を取得し、それが有効であればマ-カ-を変える、ということをしたく思っており、コ-ドを途中まで書きました(補足に記載)。
現状のコ-ドだと、ユ-ザ-がひとりでもmembership_dateが有効であれば、マップ上のマ-カ-が全て変わってしまいます。
有効なユ-ザ-の店舗だけマ-カ-を変えるにはどうすればいいでしょうか。
絞り込みはいっさいかけずに、マ-カ-だけ変える、ということをやってみたいのです。

ちなみにマ-カ-のチェンジは「marker.png」と、「marker1.png」の2種類のマ-カ-を用意しておりまして、補足に記載しているコ-ドから$markerを読み取って以下のようにしようと思っています。

"/images/marker<?php echo $marker; ?>.png"

よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2017/06/22 08:48:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:ykhpno1

// 記事の投稿者を取得して、そのカスタムフィールドmembership_dateの値を取得する
$author_id = $post->post_author;
$author_membership_date = get_user_meta($author_id, "membership_date", true);

// 現在の時刻よりも、membership_date(会員有効期間)が長い場合、$markerに1を入れる
if ( strtotime($author_membership_date) >= date_i18n('U')) {
	$marker=1;
}

ベストアンサー

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154

ポイント800pt

以前の、OpenStreetMap を使うようにしたときのコードをベースにしてます。
前は、カテゴリーごとにマーカーを変えるようにしてましたが、それは残しつつ、ログインしているユーザの投稿の場合には、マーカーを別のものに変える、というふうにしてみました。

<?php

    ...

    // address と、指定されていれば category で検索する
    $the_query = new WP_Query($args);

    if ($the_query->have_posts()):
?>
<div id="map" style="width: 99%; height: 650px;"></div>
<script type="text/javascript">
(function() {   // こんなので、くるんでみる

    var posts = [];
<?php while ($the_query->have_posts()) :
    $the_query->the_post();

    $googlemap = get_field('lat');
    if (! $googlemap) {   // マップ住所が登録されていないこともある
        continue;
    }
    $category = get_the_category();

    // ★ とりあえず、カテゴリーが marker_id
    $marker_id = $category[0]->category_nicename;

    // 記事の投稿者を取得して、そのカスタムフィールドmembership_dateの値を取得する
    $author_id = $post->post_author;
    $author_membership_date = get_user_meta($author_id, "membership_date", true);

    // 現在の時刻よりも、membership_date(会員有効期間)が長い場合、$marker_id を特別なものにする
    if ( strtotime($author_membership_date) >= date_i18n('U')) {
        $marker_id = 101;
    }
?>
    posts.push({
        lat: '<?php echo post_custom("lat")?>',
        lng: '<?php echo post_custom("lon")?>',
        name: '<?php echo post_custom("Name")?>',
        link: '<?php the_permalink();?>',
        title: '<?php the_title(); ?>',
        marker_id: '<?php echo $marker_id; ?>'          // ★ marker_id
    });
<?php endwhile; // End the loop. Whew. ?>

    ...

        var icon_map = {
            2: "/images/marker.png",
            3: "/images/marker-blue.png",
            4: "/images/marker-gold.png",
            5: "/images/marker-green.png",      // ★ここまでは、カテゴリー用のマーカー
            101: "/images/marker1.png",         // ★投稿者用のマーカー
        };

        var epsg4326 = new OpenLayers.Projection("EPSG:4326");
        var epsg3857 = new OpenLayers.Projection("EPSG:3857");

        // マーカーの生成
        var features = [];
        for (var i in posts) {
            var post = posts[i];
            features.push(new OpenLayers.Feature.Vector(
                    new OpenLayers.Geometry.Point(post.lng, post.lat)
                    .transform(epsg4326, epsg3857), {
                        tooltip: post.title,
                        marker_image: icon_map[ post.marker_id ],       // ★ marker_id
                        post: post,
                    }
            ));
        }

前は、ひとつの記事を表す javascript のオブジェクトに、カテゴリーを設定していましたが、それをマーカーを表すように変えています。
通常の場合には、マーカーを指し示す数字はカテゴリーの nickname ですが、ログイン中の利用者が投稿者の場合には、カテゴリーの nickname と重複しない値(上記のソースでは 101)を設定して、マーカーの ID と画像をひもづけるところに、投稿者用の画像を指定するようにしています。

他3件のコメントを見る
id:a-kuma3

マップに表示されるマ-カ-をクリックすることで吹き出しが表示されますが、PCでクリックした際に、マ-カ-から即座に吹き出しが表示されないのです。

以前、xdomain に環境を用意してもらったじゃないですか。
そちらのマップではどうです?
同じ状況ですか?

もしかして、Google Chrome 使ってます?
Chrome だと、反応が鈍いですねえ...
デベロッパーツールを開いた状態だと、ほぼ1クリックで行けるみたいなんですが。

2017/06/22 13:24:54
id:ykhpno1

はい、xdomainの方も鈍いんです。
そしておっしゃるようにスマホ、PCともにChromeを使っています。
なるほど、PCのブラウザ環境でしたか。
情報をいただき有難うございます。
改めて御礼申し上げます。
以前からいただいている回答でも、今回の質問に対していただいた回答でもそうですが、a-kuma3さんの現状把握能力や引き出しの多さに驚嘆しています。
たちまち原因や解決法を的確に探り当てるその腕力が本当に凄いです。
a-kuma3さんのような方を見ると、世の中広いなと実感します。

2017/06/22 14:52:22

その他の回答0件)

id:ykhpno1

質問文を編集しました。詳細はこちら

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154ここでベストアンサー

ポイント800pt

以前の、OpenStreetMap を使うようにしたときのコードをベースにしてます。
前は、カテゴリーごとにマーカーを変えるようにしてましたが、それは残しつつ、ログインしているユーザの投稿の場合には、マーカーを別のものに変える、というふうにしてみました。

<?php

    ...

    // address と、指定されていれば category で検索する
    $the_query = new WP_Query($args);

    if ($the_query->have_posts()):
?>
<div id="map" style="width: 99%; height: 650px;"></div>
<script type="text/javascript">
(function() {   // こんなので、くるんでみる

    var posts = [];
<?php while ($the_query->have_posts()) :
    $the_query->the_post();

    $googlemap = get_field('lat');
    if (! $googlemap) {   // マップ住所が登録されていないこともある
        continue;
    }
    $category = get_the_category();

    // ★ とりあえず、カテゴリーが marker_id
    $marker_id = $category[0]->category_nicename;

    // 記事の投稿者を取得して、そのカスタムフィールドmembership_dateの値を取得する
    $author_id = $post->post_author;
    $author_membership_date = get_user_meta($author_id, "membership_date", true);

    // 現在の時刻よりも、membership_date(会員有効期間)が長い場合、$marker_id を特別なものにする
    if ( strtotime($author_membership_date) >= date_i18n('U')) {
        $marker_id = 101;
    }
?>
    posts.push({
        lat: '<?php echo post_custom("lat")?>',
        lng: '<?php echo post_custom("lon")?>',
        name: '<?php echo post_custom("Name")?>',
        link: '<?php the_permalink();?>',
        title: '<?php the_title(); ?>',
        marker_id: '<?php echo $marker_id; ?>'          // ★ marker_id
    });
<?php endwhile; // End the loop. Whew. ?>

    ...

        var icon_map = {
            2: "/images/marker.png",
            3: "/images/marker-blue.png",
            4: "/images/marker-gold.png",
            5: "/images/marker-green.png",      // ★ここまでは、カテゴリー用のマーカー
            101: "/images/marker1.png",         // ★投稿者用のマーカー
        };

        var epsg4326 = new OpenLayers.Projection("EPSG:4326");
        var epsg3857 = new OpenLayers.Projection("EPSG:3857");

        // マーカーの生成
        var features = [];
        for (var i in posts) {
            var post = posts[i];
            features.push(new OpenLayers.Feature.Vector(
                    new OpenLayers.Geometry.Point(post.lng, post.lat)
                    .transform(epsg4326, epsg3857), {
                        tooltip: post.title,
                        marker_image: icon_map[ post.marker_id ],       // ★ marker_id
                        post: post,
                    }
            ));
        }

前は、ひとつの記事を表す javascript のオブジェクトに、カテゴリーを設定していましたが、それをマーカーを表すように変えています。
通常の場合には、マーカーを指し示す数字はカテゴリーの nickname ですが、ログイン中の利用者が投稿者の場合には、カテゴリーの nickname と重複しない値(上記のソースでは 101)を設定して、マーカーの ID と画像をひもづけるところに、投稿者用の画像を指定するようにしています。

他3件のコメントを見る
id:a-kuma3

マップに表示されるマ-カ-をクリックすることで吹き出しが表示されますが、PCでクリックした際に、マ-カ-から即座に吹き出しが表示されないのです。

以前、xdomain に環境を用意してもらったじゃないですか。
そちらのマップではどうです?
同じ状況ですか?

もしかして、Google Chrome 使ってます?
Chrome だと、反応が鈍いですねえ...
デベロッパーツールを開いた状態だと、ほぼ1クリックで行けるみたいなんですが。

2017/06/22 13:24:54
id:ykhpno1

はい、xdomainの方も鈍いんです。
そしておっしゃるようにスマホ、PCともにChromeを使っています。
なるほど、PCのブラウザ環境でしたか。
情報をいただき有難うございます。
改めて御礼申し上げます。
以前からいただいている回答でも、今回の質問に対していただいた回答でもそうですが、a-kuma3さんの現状把握能力や引き出しの多さに驚嘆しています。
たちまち原因や解決法を的確に探り当てるその腕力が本当に凄いです。
a-kuma3さんのような方を見ると、世の中広いなと実感します。

2017/06/22 14:52:22

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません