🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

4226閲覧

WordPress:50音順に見出し付きで表示させたい(固定ページに)

nddf

総合スコア23

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/01/06 14:57

WPのカスタム投稿で、会社名リスト一覧を固定ページで出力し
50音順に見出し付きで表示させたいのですが、うまくいきません。。

参考
http://creatornote.nakweb.com/title_abc/
https://hp-maruwakari.com/wp-aiueo/

上記のような例です。
PHP、WP初学者で、教えていただけると大変ありがたいです。

PHP

1<article id="article" class="clearfix"> 2 3 <?php 4 $furigana = 'kana'; // acfのフィールド名 5 6 $en_abcd = "/[abcd]/"; 7 $en_efgh = "/[efgh]/"; 8 $en_ijkl = "/[ijkl]/"; 9 $en_mnop = "/[mnop]/"; 10 $en_qrst = "/[qrst]/"; 11 $en_uvwxyz = "/[uvwxyz]/"; 12 13 $jp_agyo = "/[あいうえお]/"; 14 $jp_kagyo = "/[かきくけこがぎぐげご]/"; 15 $jp_sagyo = "/[さしすせそざじずぜぞじゃじゅじょ]/"; 16 $jp_tagyo = "/[たちつてとだぢづでど]/"; 17 $jp_nagyo = "/[なにぬねの]/"; 18 $jp_hagyo = "/[はひふへほばびぶべぼぱぴぷぺぽびゅ]/"; 19 $jp_magyo = "/[まみむめも]/"; 20 $jp_yagyo = "/[やゆよ]/"; 21 $jp_ragyo = "/[らりるれろ]/"; 22 $jp_wagyo = "/[わをん]/"; 23 24 $mojilist = array($en_abcd,$en_efgh,$en_ijkl,$en_mnop,$en_qrst,$en_uvwxyz,$jp_agyo,$jp_kagyo,$jp_sagyo,$jp_tagyo,$jp_nagyo,$jp_hagyo,$jp_magyo,$jp_yagyo,$jp_ragyo,$jp_wagyo); 25 $mojilabel = array("A-D","E-H","I-L","M-P","Q-T","U-Z","あ行","か行","さ行","た行","な行","は行","ま行","や行","ら行","わ行"); 26 27 $args = array( 28 'post_type' => 'suppliers', //カスタム投稿タイプ名 29 'posts_per_page' => -1, // 表示件数 30 'meta_key' => $furigana, // カスタムフィールドキー 31 'orderby' => 'meta_value', // meta_valueの値で並べる 32 'order' => 'ASC', // 昇順で順序付け 33 ); 34 35 $wp_query = new WP_Query($args); 36 37 $i = 0; 38 39 if( $wp_query->have_posts()): while ( $wp_query->have_posts() ): $wp_query->the_post(); 40 41 $first_word = the_field($furigana); 42 $first_word = mb_substr($first_word, 0, 1); 43 foreach ($mojilist as $value): 44 if(strpos($value, $first_word)): 45 //見出しをつける 46 $arrayindex = array_search($value, $mojilist); 47 if($i == 0){ 48 //最初のみ 49 echo '<h2>'. $mojilabel[$arrayindex] .'</h2><ul>'; 50 ${"count".$arrayindex} = ${"count".$arrayindex} + 1; 51 $i = $i + 1; 52 }else{ 53 if(${"count".$arrayindex} == 0){ 54 echo '</ul><h2>'. $mojilabel[$arrayindex] .'</h2><ul>'; 55 } 56 ${"count".$arrayindex} = ${"count".$arrayindex} + 1; 57 } 58 ?> 59 <ul> 60 <li><a href="<?php the_field('url'); ?>"><?php the_title(); ?></a><span><?php the_field($furigana) ?></span></li> 61 <?php endif; endforeach; endwhile; ?> 62 </ul><?php if ( $wp_query->have_posts() ): ?></ul><?php endif; ?> 63<?php endif; ?> 64 65 </article><!-- END #article -->

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2021/01/06 21:48

> うまくいきません。 では、状況がわかりませんので、 - 画面に何かメッセージは表示されますか?  - Webブラウザのデベロッパーツールには何か表示されていますか? - WebサーバーやPHPのログには何か記録されていますか? 等々 発生している内容を具体的に記載して、どのような状態になっているのかを具体的に書いていただけないでしょうか。
nddf

2021/01/07 02:48

すみません。 <article>...</article>が表示されないです。
nddf

2021/01/09 07:17

```ここに言語を入力 コード ```
guest

回答2

0

$jp_agyo = "/[あいうえお]/";みたいに正規表現で各条件を書いてるのに
if(strpos($value, $first_word)):と単純な文字列検索で判定してる
使うならpreg_matchです

ついでにリファクタリング的なこと

わざわざarray_searchしなくてもforeachでインデックスは取れます

php

1foreach ($mojilist as $value): 2 ...3 $arrayindex = array_search($value, $mojilist); 45foreach ($mojilist as $arrayindex=>$value): 6 ...

投稿がソートされているなら既に出力済みの行の判定は必要ないはずです
「現在出力中の行とマッチしているか」を判定し
「マッチしなかったら次の行の条件で判定」というやり方の方が
${"count".$arrayindex}みたいな変数を作る必要もなく
シンプルで処理が少なく済むはずです

投稿2021/01/06 23:39

KazuhiroHatano

総合スコア7819

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nddf

2021/01/07 03:15

KazuhiroHatanoさま ありがとうございます。 書き方がわかっておらず、苦労してます。 preg_matchを調べてみました。 https://deco8.net/web/how-to-list-custom-posts-in-alphabetical-order/ こちらの書き方がそうなのかなと思うんですが、 こちらはアルファベットA-Zで並べてるので これの50音順版をつくりたいです。 そもそもがわかっていないのでどうカスタマイズしていいのか。。。すみません。
KazuhiroHatano

2021/01/07 03:43

正規表現は読めないなら使わない方がいいですし preg_matchは公式のヒントでも書いてますが 使わないでできることなら使わない方がいいです https://www.php.net/manual/ja/function.preg-match.php やろうとしてることは正規表現を使わなくてもできるので $mojilistを正規表現パターンにせず普通の文字列にして strposで判定する形にしましょう 公式に書かれている通りstrposは0を返すことがあるので 判定は!==falseで厳密にしなくてはダメです https://www.php.net/manual/ja/function.strpos.php
nddf

2021/01/09 07:24

ありがとうございます! 参考になりました。まだまだ全然書けないので もっと勉強してみます。
guest

0

自己解決

ありがとうございました。
色々と調べて、functions.phpに書いてショートコードで出力する方法で
なんとかなりました。

php

1 2function yomilistFunc($atts) 3{ 4 // インデックス(行) 5 $indexes_parents = array( 6 "あ行" => "[ア-オ]", 7 "か行" => "[カ-コ]", 8 "さ行" => "[サ-ソ]", 9 "た行" => "[タ-ト]", 10 "な行" => "[ナ-ノ]", 11 "は行" => "[ハ-ホ]", 12 "ま行" => "[マ-モ]", 13 "や行" => "[ヤ-ヨ]", 14 "ら行" => "[ラ-ロ]", 15 "わ行" => "[ワ-ン]", 16 "その他" => ".*" 17 ); 18 // インデックス(50音) 19 $indexes = array( 20 "ア" => "[ア]", "イ" => "[イ]", "ウ" => "[ウ]", "エ" => "[エ]", "オ" => "[オ]", 21 "カ" => "[カ]", "キ" => "[キ]", "ク" => "[ク]", "ケ" => "[ケ]", "コ" => "[コ]", 22 "サ" => "[サ]", "シ" => "[シ]", "ス" => "[ス]", "セ" => "[セ]", "ソ" => "[ソ]", 23 "タ" => "[タ]", "チ" => "[チ]", "ツ" => "[ツ]", "テ" => "[テ]", "ト" => "[ト]", 24 "ナ" => "[ナ]", "ニ" => "[ニ]", "ヌ" => "[ヌ]", "ネ" => "[ネ]", "ノ" => "[ノ]", 25 "ハ" => "[ハ]", "ヒ" => "[ヒ]", "フ" => "[フ]", "ヘ" => "[ヘ]", "ホ" => "[ホ]", 26 "マ" => "[マ]", "ミ" => "[ミ]", "ム" => "[ム]", "メ" => "[メ]", "モ" => "[モ]", 27 "ヤ" => "[ヤ]", "ユ" => "[ユ]", "ヨ" => "[ヨ]", 28 "ラ" => "[ラ]", "リ" => "[リ]", "ル" => "[ル]", "レ" => "[レ]", "ロ" => "[ロ]", 29 "ワ" => "[ワ]", "ン" => "[ン]", 30 "その他" => ".*" 31 ); 32 global $post; 33 // 記事データを取得 34 // 記事の取得条件 35 $args = array( 36 'posts_per_page' => '-1', // 取得記事数無制限 37 'post_type' => 'suppliers', 38 'post_status' => 'publish', // 公開中 39 'meta_key' => 'yomi', // カスタムフィールドyomiを持っている記事 40 'meta_value' => '', // カスタムフィールドyomiの値は指定しない 41 'orderby' => 'meta_value', // カスタムフィールドyomiの値を基準に並び替え 42 'order' => 'asc' // 昇順に並び替え 43 ); 44 $my_posts = get_posts($args); // 上記条件で記事を取得 45 $post_data_set = array(); // 配列$post_data_setを用意 46 // 上記条件の投稿があるなら 47 if ($my_posts) { 48 foreach ($my_posts as $post) : // ループスタート 49 setup_postdata($post); // get_the_title() などのテンプレートタグを使えるようにする 50 // ヨミガナの1文字目を取得する(濁点、半濁点は分離) 51 $yomi = get_post_meta($post->ID, 'yomi', true); // カスタムフィールドyomiの値を取得 52 $yomi_conv = mb_convert_kana($yomi, 'k', 'UTF-8'); // 全角カタカナを半角カタカナに変換(濁点、半濁点を分離) 53 $yomi_conv = mb_convert_kana($yomi_conv, 'K', 'UTF-8'); // 半角カタカナを全角カタカナに変換 54 $yomi_first = mb_substr($yomi_conv, 0, 1); // 先頭の1文字を取得 55 // 配列に格納する 56 $posts['title'] = get_the_title(); // タイトル 57 $posts['permalink'] = get_permalink(); // URL 58 $posts['yomi'] = $yomi; // ヨミガナ 59 $posts['yomi_first'] = $yomi_first; // ヨミガナ1文字目 60 $post_data_set[] = $posts; // 配列に格納 61 endforeach; // ループ終わり 62 } 63 // インデックス(50音)ごとの配列に格納する 64 $post_data_set_index = array(); 65 foreach ($post_data_set as $key => $val) { 66 $char = mb_substr($val['yomi_first'], 0, 1); 67 foreach ($indexes as $index => $pattern) { 68 if (preg_match("/^" . $pattern . "/u", $char)) { 69 $post_data_set_index[$index][] = $post_data_set[$key]; 70 break; 71 } 72 } 73 } 74 // インデックス(行)ごとの配列に格納する 75 $post_data_set_index_parent = array(); 76 foreach ($post_data_set_index as $key => $val) { 77 foreach ($indexes_parents as $indexes_parent => $patterns) { 78 if (preg_match("/^" . $patterns . "/u", $key)) { 79 $post_data_set_index_parent[$indexes_parent][$key] = $post_data_set_index[$key]; 80 break; 81 } 82 } 83 } 84 // HTML出力 85 $output = ""; 86 if ($post_data_set_index_parent) { 87 // 行ごとに展開 88 foreach ($post_data_set_index_parent as $indexes_parent => $posts) : // ループスタート 89 $output .= '<h2>' . $indexes_parent . '</h2>'; 90 // 50音ごとに展開 91 foreach ($posts as $index => $post) : // ループスタート 92 $output .= '<h3>' . $index . '</h3>'; 93 $output .= '<ul>' . "\n"; 94 foreach ($post as $key => $val) { 95 $output .= '<li>'; 96 $output .= '<a href="' . $val['permalink'] . '">' . $val['title'] . '</a>'; 97 $output .= '</li>' . "\n"; 98 } 99 $output .= '</ul>' . "\n"; 100 endforeach; // ループ終わり 101 endforeach; // ループ終わり 102 } 103 // クエリのリセット 104 wp_reset_postdata(); 105 return $output; 106} 107add_shortcode('yomilist', 'yomilistFunc');

投稿2021/01/09 07:21

nddf

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問