サポート » 使い方全般 » category-カテゴリ名.phpで投稿タグ別に一覧表示

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • phpの記述の良し悪しよりも、データ量が多いので時間がかかっているのではありませんか?

    とは言うものの、幾つかスピードアップの工夫はあると思います。
    (冗長な処理を省いてシンプルにすれば少しは速くなるでしょう)

    • カテゴリーアーカイブではなく固定ページのテンプレートにphpを書く
    • setup_postdataとwp_reset_postdataを省く。その代わりに the_title ⇒ get_the_title や、post_custom ⇒ get_post_meta のように置き換える。
    トピック投稿者 AVION

    (@avion)

    gblsmさん、見ていただきましてありがとうございます!

    データ量は多いと思います。
    shopカテゴリが720投稿、onlineshopカテゴリが70投稿です。
    また、レンタルサーバーでapacheモジュールのmod_expiresが利用不可なため、全体的に動きが鈍いのですが、特にこの店舗ページは遅い時は10秒近くかかってしまい、なにか対策があればと思っております。。

    お教えいただいた工夫を試してみましたが、あまりスピードは変わりませんでした。

    1.category-shoplist.phpをpage-shoplist.phpにして固定ページを作成。
    2.以前のソースを下記に変更。

    <!-- 県別店舗一覧 -->
    <!-- 北海道 -->
    <h3 id="hokkaido" name="hokkaido">北海道</h3>
    <?php
    	$newslist = get_posts( array(
    		'category_name' => 'shop', //店舗カテゴリー
    		'tag_slug__in' => array('pref-hokkaido' ), //県名タグ
    		'posts_per_page' => -1 //全部表示
    		));
    	foreach( $newslist as $post ):
    ?>
    	<dl>
    	<dt class="name"><?php echo get_the_title(); ?></dt>
    	<dd class="address"><?php the_field('shop-address',$post->ID); ?></dd>
    	<dd class="tel"><?php the_field('shop-tel',$post->ID); ?></dd>
    	<dd class="maplink"><!-- googleMapリンク -->
    	<?php
    	$address = get_post_meta( get_the_ID(), 'shop-address', true );
    	if (!empty($address)) {
    		$address2 = urlencode($address);
    		$zoom = 15;
    		$url = "http://maps.google.co.jp/maps?q={$address2}&z={$zoom}";
    		echo '<a href="' . $url . '" target="_blank" title="GoogleMapで地図を見る" class="over"><img src="' . get_bloginfo('template_url') . '/common/img/store/btn-map.gif" width="90" height="30"></a>';
    	}
    	?>
    	</dd>
    	</dl>
    <?php
    	endforeach;
    ?>

    書き方間違えておりますでしょうか、、?

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

    shopカテゴリが720投稿、onlineshopカテゴリが70投稿です。

    tag_slug__in を指定しないで全部の都道府県を表示するように変えた場合は何秒かかりますか?それでも10秒位ならサーバー自体の高速化(CPU、メモリ、Apacheやnginx)を考えたほうがよいと思います。

    コードの方は気付いた箇所を直してみました。テスト実行していませんが御勘弁下さい。

    <!-- 県別店舗一覧 -->
    <!-- 北海道 -->
    <h3 id="hokkaido" name="hokkaido">北海道</h3>
    <?php
    	$newslist = get_posts( array(
    		'category_name' => 'shop', //店舗カテゴリー
    		'tag' => 'pref-hokkaido', //県名タグ tag_slug__in より速いかも
    		'posts_per_page' => -1 //全部表示
    		));
    	foreach( $newslist as $mypost ):
    	$myid = $mypost->ID;
    ?>
    	<dl>
    	<dt class="name"><?php echo get_the_title( $mypost ); ?></dt>
    	<dd class="address"><?php the_field( 'shop-address', $myid ); ?></dd>
    	<dd class="tel"><?php the_field( 'shop-tel', $myid ); ?></dd>
    	<dd class="maplink"><!-- googleMapリンク -->
    	<?php
    	$address = get_post_meta( $myid, 'shop-address', true );
    	if (!empty($address)) {
    		$address2 = urlencode($address);
    		$zoom = 15;
    		$url = "http://maps.google.co.jp/maps?q={$address2}&z={$zoom}";
    		echo '<a href="' . $url . '" target="_blank" title="GoogleMapで地図を見る" class="over"><img src="' . get_bloginfo('template_url') . '/common/img/store/btn-map.gif" width="90" height="30"></a>';
    	}
    	?>
    	</dd>
    	</dl>
    <?php
    	endforeach;
    ?>

    改めて考えてみたのですが、1つのWebページに790の投稿を全部出力しているのでHTMLソースの大きさも相当ですよね。サーバー側よりWebブラウザ側で時間がかかっているのかも。

    トピック投稿者 AVION

    (@avion)

    gblsmさん、度々ありがとうございます。

    修正したものをGTmetrixで比較してみましたところ、
    ・最初に修正したコードでPage load time: 9.26s
    ・先ほどお教えいただいたコード(問題なく動きました)でPage load time: 7.04s
    と、少し早くなりました。

    また、試しに出力されたhtmlソースをコピペしたもので固定ページを作成したら530kbもありました。
    そのページはPage load time: 5.72sでした。

    gblsmさんに見ていただいて、最初からおっしゃるようにデータ量が多い790件を全件出すこと自体が負担になっているような気がします。
    このような場合は、出力をいくつかの県別で分けるなどするのが一番の解決策と言えますでしょうか?

    サーバー自体を能力増強しない場合は、既に考えていらっしゃるとおり投稿数を減らす(例えば関東、中部、北陸、関西…)位しか思いつかないですね。
    サーバー増強の方では例えばApacheをnginxに変えるとか、速いCPUに変えるとかも考えられそうですが、そちら方面はあまり詳しくないので止めておきます。すみません。

    トピック投稿者 AVION

    (@avion)

    gblsmさん、色々とありがとうございます!

    サーバー増強の方もご意見いただきまして大変参考になります。
    今のレンタルサーバーで別サービスだとnginxが使えるらしいので、
    そちらも含め検討するようにいたします。

    phpの知識が足りずどこが問題なのかが一人で判断できず、
    見ていただいてとても勉強になりました。
    本当にありがとうございます。

    解決済みとさせていただきます!

    モデレーター Takuro Hishikawa

    (@hissy)

    解決済みのようですが、都合48回SQLを発行しているのが原因だと思います。一度に取得したらいいのでは?こんな風に。

    <?php
    // 全都道府県分を一度のSQLで取得
    $posts = get_posts(array(
    	'category_name' => 'shop',
    	'posts_per_page' => -1
    ));
    
    $prefecture_keys = array('pref-hokkaido','pref-aomori','pref-akita'); // 47都道府県の並び順の定義
    $prefecture_posts = array(); // 空の配列を用意
    
    // タグごとに投稿をまとめる
    foreach ($posts as $post) {
    	$the_tags = wp_get_post_terms($post->ID);
    	if (is_array($the_tags)) {
    		foreach ($the_tags as $tag) {
    			$prefecture_posts[$tag->slug][] = $post;
    		}
    	}
    }
    
    // 47都道府県それぞれの配列を順番に出力
    foreach ($prefecture_keys as $prefecture) {
    	if (isset($prefecture_posts[$prefecture])) {
    		foreach ($prefecture_posts[$prefecture] as $post) {
    			echo $post->post_title;
    		}
    	}
    }
    モデレーター Takuro Hishikawa

    (@hissy)

    まあ、記述を工夫するより、WP Super Cacheでも入れた方が速攻で速くなると思いますけどね…

    トピック投稿者 AVION

    (@avion)

    Takuro Hishikawaさん、解決済みにしたのに見ていただきましてありがとうございます!

    WP Super Cacheを入れておらず、、、入れたら速攻で速くなりました。非常にお恥ずかしいのですがサクサク動きまして本当に解決いたしました!

    WP Super Cacheを入れる前に、お教えいただいたコードを試してみましたら、
    全都道府県分入れなくてもちゃんと出力されました。ありがとうございます。

    その最後の部分で出力の仕方について質問させていただきたいところがあるのですが、、

    <?php
    // 47都道府県それぞれの配列を順番に出力
    foreach ($prefecture_keys as $prefecture) {
    	if (isset($prefecture_posts[$prefecture])) {
    		foreach ($prefecture_posts[$prefecture] as $post) {
    ?>
    <h3 id="hokkaido" name="hokkaido">北海道</h3>
    <dl>
    <dt class="name"><?php echo get_the_title( $post ); ?></dt>
    <dd class="address"><?php the_field( 'shop-address', $post->ID ); ?></dd>
    <dd class="tel"><?php the_field( 'shop-tel', $post->ID ); ?></dd>
    <dd class="maplink"><!-- googleMapリンク -->
    <?php
    $address = get_post_meta( $post->ID, 'shop-address', true );
    if (!empty($address)) {
    	$address2 = urlencode($address);
    	$zoom = 15;
    	$url = "http://maps.google.co.jp/maps?q={$address2}&z={$zoom}";
    	echo '<a href="' . $url . '" target="_blank" title="GoogleMapで地図を見る" class="over"><img src="' . get_bloginfo('template_url') . '/common/img/store/btn-map.gif" width="90" height="30"></a>';
    }
    ?>
    </dd>
    </dl>
    <?php
    			echo $post->post_title;
    		}
    	}
    }
    ?>

    <h3 id=”hokkaido” name=”hokkaido”>北海道</h3>
    のところに該当タグの名前を出したいのですが、
    どう書けば良いのでしょうか?
    すみません、出力のしかたを教えてください、
    よろしくお願いいたします。

    モデレーター Takuro Hishikawa

    (@hissy)

    変数 $prefecture にタグのスラッグが入っていますので、get_term_by()を使ってタグのデータに戻すことができます

    トピック投稿者 AVION

    (@avion)

    Takuro Hishikawaさん、ありがとうございます!

    get_term_by()を使って下記のように書いたら希望通りの動作になりました。

    <?php
    // 47都道府県それぞれの配列を順番に出力
    foreach ($prefecture_keys as $prefecture) {
    	if (isset($prefecture_posts[$prefecture])) {
    ?>
    <h3 id="<?php echo $prefecture; ?>" name="<?php echo $prefecture; ?>"><?php echo get_term_by('slug',$prefecture,'post_tag')->name; ?></h3>
    <?php
    		foreach ($prefecture_posts[$prefecture] as $post) {
    ?>
    <dl>
    <dt class="name"><?php echo get_the_title( $post ); ?></dt>
    <dd class="address"><?php the_field( 'shop-address', $post->ID ); ?></dd>
    <dd class="tel"><?php the_field( 'shop-tel', $post->ID ); ?></dd>
    <dd class="maplink"><!-- googleMapリンク -->
    <?php
    $address = get_post_meta( $post->ID, 'shop-address', true );
    if (!empty($address)) {
    	$address2 = urlencode($address);
    	$zoom = 15;
    	$url = "http://maps.google.co.jp/maps?q={$address2}&z={$zoom}";
    	echo '<a href="' . $url . '" target="_blank" title="GoogleMapで地図を見る" class="over"><img src="' . get_bloginfo('template_url') . '/common/img/store/btn-map.gif" width="90" height="30"></a>';
    }
    ?>
    </dd>
    </dl>
    <?php
    		}
    	}
    }
    ?>

    どうもありがとうございます、
    解決済みとさせていただきます。

    gblsmさん、Takuro Hishikawaさん、ありがとうございました。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「category-カテゴリ名.phpで投稿タグ別に一覧表示」には新たに返信することはできません。