サポート » 使い方全般 » get_posts を含めたコードをもっと簡潔にしたい

  • 解決済 ibis7788

    (@ibis7788)


    「Advanced Custom Field」プラグインを使用してはいますが、どちらかと言うとこちらのフォーラムの方がいいかと思い、投稿します。
    カスタムタクソノミー「shop」を作成、「Advanced Custom Field」でカスタムフィールドを作成し店舗の情報を登録、店舗一覧ページを作成し、get_posts を使用して47都道府県に分けて表示させるようにしました。
    表示自体はうまくいったのですが、PHP自体詳しくないのもあり、同じ表記を繰り返し書いてしまっています。もっと簡潔にできるのではないかと思い、どなたかお知恵を拝借したく存じます。

    カスタムフィールド「pref」で都道府県の店舗を絞り込んでいます。

    <div class="area"><img src="<?php bloginfo('template_url'); ?>/images/shop/tab_hokkaido.gif" width="580" height="30" alt="北海道" /></div>
    <?php
    $posts = get_posts(array(
    	'numberposts' => 10,
    	'post_type' => 'shop',
    	'orderby' => 'meta_value',
    	'meta_key' => 'pref',
    	'order' => 'ASC',
    	'post_status' => 'publish',
    	'meta_query' => array(
    		array(
    			'key' => 'pref',
    			'value' => '0101',
    		)
    	)
    ));
    
    if($posts){
    	echo '<div class="pref">北海道</div>';
    	foreach($posts as $post){
    		echo '<h3><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></h3>';
    		echo '<div class="box">';
    	if(get_field('main_image')) {
           		echo '<p class="alignleft">';
                $attachment_id = get_field('main_image');
                $size = "thumbnail";
                $image = wp_get_attachment_image_src( $attachment_id, $size );
                $attachment = get_post( get_field('main_image') );
                $alt = get_post_meta($attachment->ID, '_wp_attachment_image_alt', true);
                $image_title = $attachment->post_title;
    
            	echo '<a href="';
    			echo get_permalink($post->ID);
    			echo '"><img src="';
    			echo $image[0];
    			echo '" width="';
    			echo $image[1];
    			echo '" height="';
    			echo $image[2];
    			echo '" alt="';
    			echo $alt;
    			echo '" title="';
    			echo $image_title;
    			echo '" class="main_img" />';
            	echo '</a></p>';
    	}else{
    	}
    	echo '<ul>';
    	if(get_field('zipcode')) {
            echo '<li>〒';
    		the_field('zipcode');
    		echo '</li>';
    	}else{
    	}
    	if(get_field('address')) {
            echo '<li>';
    		the_field('address');
            echo '<br />';
    		the_field('building');
    		echo '</li>';
    	}else{
    	}
    	if(get_field('shop_tel')) {
            echo '<li>TEL:';
    		the_field('shop_tel');
    
    		if(get_field('shop_tel_type')=='chokutsu') {
    			echo '(直通)';
    		} elseif(get_field('shop_tel_type')=='daihyo'){
    			echo '(代)';
    		}else{
    		}
    		echo '</li>';
    	}else{
    	}
    	echo '</ul>';
    	echo '</div>';
    
    	}
    }else{
    }
    ?>
    
    <div class="area"><img src="<?php bloginfo('template_url'); ?>/images/shop/tab_touhoku.gif" width="580" height="30" alt="東北地方" /></div>
    <?php
    $posts = get_posts(array(
    	'numberposts' => 10,
    	'post_type' => 'shop',
    	'orderby' => 'meta_value',
    	'meta_key' => 'pref',
    	'order' => 'ASC',
    	'post_status' => 'publish',
    	'meta_query' => array(
    		array(
    			'key' => 'pref',
    			'value' => '0201',
    		)
    	)
    ));
    
    if($posts){
    	echo '<div class="pref">青森県</div>';
    	foreach($posts as $post){
    		echo '<h3><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></h3>';
    		echo '<div class="box">';
    	if(get_field('main_image')) {
           		echo '<p class="alignleft">';
                $attachment_id = get_field('main_image');
                $size = "thumbnail";
                $image = wp_get_attachment_image_src( $attachment_id, $size );
                $attachment = get_post( get_field('main_image') );
                $alt = get_post_meta($attachment->ID, '_wp_attachment_image_alt', true);
                $image_title = $attachment->post_title;
    
            	echo '<a href="';
    			echo get_permalink($post->ID);
    			echo '"><img src="';
    			echo $image[0];
    			echo '" width="';
    			echo $image[1];
    			echo '" height="';
    			echo $image[2];
    			echo '" alt="';
    			echo $alt;
    			echo '" title="';
    			echo $image_title;
    			echo '" class="main_img" />';
            	echo '</a></p>';
    	}else{
    	}
    	echo '<ul>';
    	if(get_field('zipcode')) {
            echo '<li>〒';
    		the_field('zipcode');
    		echo '</li>';
    	}else{
    	}
    	if(get_field('address')) {
            echo '<li>';
    		the_field('address');
            echo '<br />';
    		the_field('building');
    		echo '</li>';
    	}else{
    	}
    	if(get_field('shop_tel')) {
            echo '<li>TEL:';
    		the_field('shop_tel');
    
    		if(get_field('shop_tel_type')=='chokutsu') {
    			echo '(直通)';
    		} elseif(get_field('shop_tel_type')=='daihyo'){
    			echo '(代)';
    		}else{
    		}
    		echo '</li>';
    	}else{
    	}
    	echo '</ul>';
    	echo '</div>';
    
    	}
    }else{
    }
    ?>

    以下、47都道府県分続きます。
    何卒よろしくお願いいたします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • gogoweb

    (@gogoweb)

    変化がある場所がprefのvalueと地域名だけだというのなら
    地域名=>prefのような形で連想配列を作ってそれをforeachでループさせるとかはどうでしょうか?

    個人的には作り直せるならカスタム分類で作ったほうがスマートな気もします。

    Yuji Yamabata

    (@yyengine)

    地域と都道府県を配列で管理して、ループで繰り返してあげるだけでも、だいぶコードが短くできると思います。
    たとえばこんな感じになるかと。(動作は未確認ですので、デバッグしてくださいませ)

    <?php
    $listPref =array(
    	"01" => array( "tag" => "hokkaido", "name" => "北海道",
    			"pref" => array(
    				"0101" => "北海道"
    			)
    		),
    	"02" => array( "tag" => "touhoku", "name" => "東北",
    			"pref" => array(
    				"0201" => "青森", "0202" => "岩手"
    			)
    		),
    		//以下、地方と都道府県の配列
    );
    
    foreach( $listPref as $area ) {
    	?><div class="area"><img src="<?php bloginfo('template_url'); ?>/images/shop/tab_<?php echo $area["tag"]; ?>.gif" width="580" height="30" alt="<?php echo $area["name"]; ?>" /></div><?php
    	foreach( $area["pref"] as $presid => $prefname ) {
    		//各都道府県の情報を取得
    		$posts = get_posts(array(
    			'numberposts' => 10,
    			'post_type' => 'shop',
    			'orderby' => 'meta_value',
    			'meta_key' => 'pref',
    			'order' => 'ASC',
    			'post_status' => 'publish',
    			'meta_query' => array(
    				array(
    					'key' => 'pref',
    					'value' => $presid,  //都道府県ごとのIDが入る
    				)
    			)
    		));
    
    		if($posts){
    			//各都道府県の情報を出力する
    			echo '<div class="pref">' . $prefname . '</div>';
    			foreach($posts as $post){
    				//情報出力処理
    			}
    		}
    	}
    }
    ?>
    スレッド開始 ibis7788

    (@ibis7788)

    gogoweb様・uji Yamabata様、具体的な案をありがとうございます。
    配列を作成してやってみます。
    結果はこちらにてご報告させていただきます。

    スレッド開始 ibis7788

    (@ibis7788)

    gogoweb様・uji Yamabata様、先日はご返答ありがとうございました。
    いただいた案を元にして、以下のようにしてみました。

    <?php
    $listPref =array(
    	"01" => array( "tag" => "hokkaido", "name" => "北海道",
    			"pref" => array(
    				"0101" => "北海道"
    			)
    		),
    	"02" => array( "tag" => "touhoku", "name" => "東北",
    			"pref" => array(
    				"0201" => "青森県", "0202" => "岩手県", "0203" => "宮城県", "0204" => "秋田県", "0205" => "山形県", "0206" => "福島県"
    			)
    		),
    	"03" => array( "tag" => "kanto", "name" => "関東地方",
    			"pref" => array(
    				"0301" => "茨城県", "0302" => "栃木県", "0303" => "群馬県", "0304" => "埼玉県", "0305" => "千葉県", "0306" => "東京都", "0307" => "神奈川県"
    			)
    		),
    	"04" => array( "tag" => "chubu", "name" => "中部地方",
    			"pref" => array(
    				"0401" => "新潟県", "0402" => "富山県", "0403" => "石川県", "0404" => "福井県", "0405" => "山梨県", "0406" => "長野県", "0407" => "岐阜県", "0408" => "静岡県", "0409" => "愛知県", "0410" => "三重県"
    			)
    		),
    	"05" => array( "tag" => "kinki", "name" => "近畿地方",
    			"pref" => array(
    				"0501" => "滋賀県", "0502" => "京都府", "0503" => "大阪府", "0504" => "兵庫県", "0505" => "奈良県", "0506" => "和歌山県"
    			)
    		),
    	"06" => array( "tag" => "chugoku", "name" => "中国・四国地方",
    			"pref" => array(
    				"0601" => "鳥取県", "0602" => "島根県", "0603" => "岡山県", "0604" => "広島県", "0605" => "山口県", "0606" => "徳島県", "0607" => "香川県", "0608" => "愛媛県", "0609" => "高知県"
    			)
    		),
    	"07" => array( "tag" => "kyushu", "name" => "九州地方",
    			"pref" => array(
    				"0701" => "福岡県", "0702" => "佐賀県", "0703" => "長崎県", "0704" => "熊本県", "0705" => "大分県", "0706" => "宮崎県", "0707" => "鹿児島県"
    			)
    		),
    	"08" => array( "tag" => "okinawa", "name" => "沖縄地方",
    			"pref" => array(
    				"0801" => "沖縄県"
    			)
    		)
    );
    
    foreach( $listPref as $area ) {
    ?>
    <div class="area martop50" id="<?php echo $area["tag"]; ?>"><img src="<?php bloginfo('template_url'); ?>/images/shop/tab_<?php echo $area["tag"]; ?>.gif" width="580" height="30" alt="<?php echo $area["name"]; ?>" /></div>
    <?php
    	foreach( $area["pref"] as $presid => $prefname ) {
    		//各都道府県の情報を取得
    		$posts = get_posts(array(
    			'numberposts' => 10,
    			'post_type' => 'shop',
    			'orderby' => 'meta_value',
    			'meta_key' => 'pref',
    			'order' => 'ASC',
    			'post_status' => 'publish',
    			'meta_query' => array(
    				array(
    					'key' => 'pref',
    					'value' => $presid,  //都道府県ごとのIDが入る
    				)
    			)
    		));
    
    		if($posts){
    			//各都道府県の情報を出力する
    			echo '<div class="pref">' . $prefname . '</div>';
    			foreach($posts as $post){
    				echo '<h3><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></h3>';
    				echo '<div class="box">';
    				if(get_field('main_image')) {
    					echo '<p class="alignleft">';
    					$attachment_id = get_field('main_image');
    					$size = "thumbnail"; // (thumbnail, medium, large, full or custom size)
    					$image = wp_get_attachment_image_src( $attachment_id, $size );
    					$attachment = get_post( get_field('main_image') );
    					$alt = get_post_meta($attachment->ID, '_wp_attachment_image_alt', true);
    					$image_title = $attachment->post_title;
    
    					echo '<a href="';
    					echo get_permalink($post->ID);
    					echo '"><img src="';
    					echo $image[0];
    					echo '" width="';
    					echo $image[1];
    					echo '" height="';
    					echo $image[2];
    					echo '" alt="';
    					echo $alt;
    					echo '" title="';
    					echo $image_title;
    					echo '" class="main_img" />';
    					echo '</a></p>';
    				}else{
    				}
    				echo '<ul>';
    				if(get_field('zipcode')) {
    					echo '<li>〒';
    					the_field('zipcode');
    					echo '</li>';
    				}else{
    				}
    				if(get_field('address')) {
    					echo '<li>';
    					the_field('address');
    					echo '<br />';
    					the_field('building');
    					echo '</li>';
    				}else{
    				}
    				if(get_field('shop_tel')) {
    					echo '<li>TEL:';
    					the_field('shop_tel');
    					if(get_field('shop_tel_type')=='chokutsu') {
    						echo '(直通)';
    					} elseif(get_field('shop_tel_type')=='daihyo'){
    						echo '(代)';
    					}else{
    					}
    					echo '</li>';
    				}else{
    				}
    				echo '</ul>';
    				echo '</div>';
    			}
    		} else {
    		}
    	}
    }
    ?>

    これで上手く表示できました。
    ただ、店舗がその地域に1店舗もない場合、地域名だけが表示されてしまいます。
    if文でどうにかできるかとおもったのですが、上手くできませんでした。

    最悪、店舗がない地域の配列をコメントアウトすることも考えていますが、店舗の増減が激しく、スマートではないかとは思います。
    申し訳ございませんが、お知恵を拝借できませんでしょうか。
    何卒よろしくお願い申し上げます。

    スレッド開始 ibis7788

    (@ibis7788)

    すみません「店舗がその地域に1店舗もない場合、地域名だけが表示されてしまう」件、自己解決したので、トピックを閉じます。
    皆さまありがとうございました。

    <head>タグ内に以下のように記述しました。cssの display:none; で無理矢理非表示にした形です。

    <?php
    $var01 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '01__' ");
    $shop_num01 = number_format($var01);
    
    $var02 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '02__' ");
    $shop_num02 = number_format($var02);
    
    $var03 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '03__' ");
    $shop_num03 = number_format($var03);
    
    $var04 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '04__' ");
    $shop_num04 = number_format($var04);
    
    $var05 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '05__' ");
    $shop_num05 = number_format($var05);
    
    $var06 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '06__' ");
    $shop_num06 = number_format($var06);
    
    $var07 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '07__' ");
    $shop_num07 = number_format($var07);
    
    $var08 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '08__' ");
    $shop_num08 = number_format($var08);
    
    $var09 = $wpdb->get_var("SELECT count(*) FROM $wpdb->postmeta WHERE meta_key = 'pref' AND meta_value LIKE '09__' ");
    $shop_num09 = number_format($var09);
    ?>
    
    <style type="text/css">
    <?php if($shop_num01 > 0 ) : ?>
    <?php else: ?>
    	#hokkaido.area {
    		display:none;
    	}
    <?php endif; ?>
    
    <?php if($shop_num02 > 0 ) : ?>
    <?php else: ?>
    	#touhoku.area {
    		display:none;
    	}
    <?php endif; ?>
    
    <?php if($shop_num03 > 0 ) : ?>
    <?php else: ?>
    	#kanto.area {
    		display:none;
    	}
    <?php endif; ?>
    
    <?php if($shop_num04 > 0 ) : ?>
    <?php else: ?>
    	#chubu.area {
    		display:none;
    	}
    <?php endif; ?>
    
    <?php if($shop_num05 > 0 ) : ?>
    <?php else: ?>
    	#kinki.area {
    		display:none;
    	}
    <?php endif; ?>
    
    <?php if($shop_num06 > 0 ) : ?>
    <?php else: ?>
    	#chugoku.area {
    		display:none;
    	}
    <?php endif; ?>
    
    <?php if($shop_num07 > 0 ) : ?>
    <?php else: ?>
    	#kyushu.area {
    		display:none;
    	}
    <?php endif; ?>
    
    <?php if($shop_num08 > 0 ) : ?>
    <?php else: ?>
    	#okinawa.area {
    		display:none;
    	}
    <?php endif; ?>
    
    <?php if($shop_num09 > 0 ) : ?>
    <?php else: ?>
    	#kaigai.area {
    		display:none;
    	}
    <?php endif; ?>
    </style>

    またお世話になるかもしれません。その際はよろしくお願い致します。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「get_posts を含めたコードをもっと簡潔にしたい」には新たに返信することはできません。