質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

1回答

306閲覧

explodeで再配列化すると値が取得できなくなる

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

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

PHP

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

0グッド

0クリップ

投稿2018/05/15 16:24

出力結果の違う2つのカスタムフィールドを、同じように扱いたいと思っています。
(違いは下記コードでvar_dump()して書いた通りです。)

具体的には、同じ値を持つ記事を関連記事として表示したいのですけれど、

なぜか次のコードで、tag_singleはきちんと関連記事として表示されるのに対し、tag_customは表示できません。

tag_singleの場合

php

1<?php 2$tags = SCF::get('tag_single'); 3var_dump($tags); 4//array(2) { [0]=> string(6) "値A" [1]=> string(6) "値B" } 5?> 6 7<?php 8$myposts = get_posts( array( 9 'post_type' => 'post', 10 'posts_per_page' => '4', 11 'post__not_in' => array( $post->ID ), 12 'meta_query' => array( 13 array( 14 'key' => 'tag_single', 15 'value' => $tags, 16 'compare' => 'IN' 17 ) 18 ), 19 'orderby' => 'rand' 20) ); ?> 21 22<?php if( $myposts ): ?> 2324<?php endif; ?>

tag_customの場合

php

1<?php 2$tag_custom = get_post_meta(get_the_ID(),'tag_custom',false); 3var_dump($tag_custom); 4//array(1) { [0]=> string(14) "値A| 値B" } 5 6 foreach($tag_custom as $tag_custom1) { 7 $tag_custom2 = explode( '|', $tag_custom1 ); 8} 9?> 10 11<?php 12$myposts = get_posts( array( 13 'post_type' => 'custom', 14 'posts_per_page' => '4', 15 'post__not_in' => array( $post->ID ), 16 'meta_query' => array( 17 array( 18 'key' => 'tag_custom', 19 'value' => $tag_custom2, 20 'compare' => 'IN' 21 ) 22 ), 23 'orderby' => 'rand' 24) ); ?> 25 26<?php if( $myposts ): ?> 2728<?php endif; ?>

ご覧のようにtag_customの場合は配列は[0]だけでその中に値Aと値Bがまとまって出力されてしまうので、一度explodeして再配列化しました。こうすればtag_singleと同じように扱うことができると思っているのですが、、できず。(>_<)

どなたか直し方を教えて頂ければと思います。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

データベースには 値A| 値B のように保存されているため、
'compare' => 'IN' では検索しても引っかからないと思います。

pre_get_posts アクションをフックしてどうにかするなど手段はあると思いますが、
カスタムフィールドを配列形式で保存するよう変更するのが手っ取り早いと思います。

投稿2018/05/15 17:35

yhg

総合スコア2161

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

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

退会済みユーザー

退会済みユーザー

2018/05/15 18:30

そうなのですか。困りました。 実はカスタムフィールドはそれぞれ別のプラグインで設置したもので、保存形式の変更が難しそうなのです。 pre_get_postを使う方法と言いいますと、具体的にはどのようなものになりますでしょうか?
yhg

2018/05/15 19:04 編集

すいません、pre_get_post 無理っぽい感じでした。 ちょっと考えてみたんですが、 'meta_query' => array( array( 'key' => 'tag_custom', 'value' => '(^値A$)|(^値A\|)|(\|値A$)|(\|値A\|)', 'compare' => 'REGEXP' ), array( 'key' => 'tag_custom', 'value' => '(^値B$)|(^値B\|)|(\|値B$)|(\|値B\|)', 'compare' => 'REGEXP' ) ), みたいな感じにすればいけるかもしれません。
退会済みユーザー

退会済みユーザー

2018/05/15 19:25 編集

ありがとうございます! 試してみましたが、残念ながら…(>_<) でもvalueに全部入れるという方法は良さそうに思います。 また何か思いつくことがあればいつもで仰ってくださいませ。 ちなみに、そのvalueにそうやって入れる方法については、どちらを参照すればよろいでしょうか?かっこでくくったり、¥を書いたり、そのあたりのルールを知って、いろいろ試してみたいと思いまして…
退会済みユーザー

退会済みユーザー

2018/05/15 19:27

質問文で「var_dump」したとき、「"値A| 値B"」というふうにチョト半角が入っているのですが、これは別に関係ありませんよね?
退会済みユーザー

退会済みユーザー

2018/05/15 19:32

あっ、 'relation' => 'OR', と追加したらいけたかもしれません!!
yhg

2018/05/15 19:34

半角のところで何かおかしかったら (^値A$)|(^値A\|)|(\|\s*値A$)|(\|\s*値A\|) とかすれば良いかなと思います。いけたなら良かったです。
退会済みユーザー

退会済みユーザー

2018/05/15 19:37

なるほど。重ね重ねありがとうございます! ちなみに「REGEXP」というのはどういう意味なのでしょうか? compareの一覧とか載っているところがなくてちょっと疑問に思っています。
退会済みユーザー

退会済みユーザー

2018/05/15 19:55

早朝から何度も申し訳ございません( 一一) 値が2個以上あるときの書き方だけ教えていただけませんでしょうか? これではダメなようでして… 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'tag_forums', 'value' => '(^値A$)|(^値A\|)|(\|値A$)|(\|値A\|)', 'compare' => 'REGEXP' ), array( 'key' => 'tag_forums', 'value' => '(^値B$)|(^値B\|)|(\|値B$)|(\|値B\|)', 'compare' => 'REGEXP' ), array( 'key' => 'tag_forums', 'value' => '(^値C$)|(^値C\|)|(\|値C$)|(\|値C\|)', 'compare' => 'REGEXP' ), array( 'key' => 'tag_forums', 'value' => '(^値D$)|(^値D\|)|(\|値D$)|(\|値D\|)', 'compare' => 'REGEXP' ), array( 'key' => 'tag_forums', 'value' => '(^E値$)|(^E値\|)|(\|E値$)|(\|E値\|)', 'compare' => 'REGEXP' ) ),
退会済みユーザー

退会済みユーザー

2018/05/15 19:57

一覧ありがとうございます。見ておきます。
yhg

2018/05/15 20:06

こんな感じですかねー。 $meta_query = array_map(function ($tag) { return [ 'key' => 'tag_forums', 'value' => '(^'.$tag.'$)|(^'.$tag.'\|)|(\|'.$tag.'$)|(\|'.$tag.'\|)', 'compare' => 'REGEXP', ]; }, $tag_custom2); $meta_query['relation'] = 'OR'; $myposts = get_posts([ 'post_type' => 'custom', 'posts_per_page' => '4', 'post__not_in' => [$post->ID], 'meta_query' => $meta_query, 'orderby' => 'rand', ]);
退会済みユーザー

退会済みユーザー

2018/05/15 20:19

きゃーぜんぜん違うwwこれはついでの質問にすべきではありませんでしたね。大変なお手数をおかけしてしまいました。 にもかかわらず、完璧なご回答をくださって誠に感謝です。心からお礼申し上げます。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問