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

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

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

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

PHP

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

Q&A

解決済

3回答

1872閲覧

phpで「ターム」等を出力する方法をたくさん知りたい

kotoritori

総合スコア11

WordPress

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

PHP

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

0グッド

0クリップ

投稿2018/03/17 23:54

編集2018/03/18 13:17

実現したいこと

お世話になります。

phpで以下を出力したいです。

➀カスタムフィールド「field_eat」の値

(例)フルーツ

➁カスタムタクソノミー「fruits」のターム

(例)リンゴ、バナナ

自動ツイートとして下図の出力をイメージしています。
イメージ説明

前提

自動ツイートライブラリ「tmhOAuth(https://github.com/themattharris/tmhOAuth)」を使っており、もともとのコードはこうなっています。
➡【過去記事】、本文、URLがツイートされます。

php

1$params = array( 2 'status' => mb_strimwidth('【過去記事】'.strip_tags($post[0]->post_content), 0, 116, "..."). ' ' . get_permalink($post[0]->ID) 3);

試したことA

まずは上を次のように書き換えてみました。
➡URLだけしかツイートされません。

php

1$params = array( 2 'status' => post_custom($post->ID,'field_eat')."\n".get_the_terms($post->ID,'fruits')."\n". get_permalink($post[0]->ID) 3);

試したことB

今度は別の場所に代入してから出力してみようと思って次のように書き換えてみました。
➡やはりURLだけしかツイートされません。

PHP

1$field_eat = post_custom($post->ID,'field_eat'); 2$fruits = get_the_terms($post->ID,'fruits'); 3 4$params = array( 5 'status' => "{$field_eat}"."\n"."{$fruits}"."\n". get_permalink($post[0]->ID) 6);

どのように書けばきちんと上図のようになるのか、教えていただけませんでしょうか?

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

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

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

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

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

bassbone

2018/03/18 08:42

質問文に記載のコードではどのように出力されるのか、画像等で提供いただけませんでしょうか。
kotoritori

2018/03/18 11:29 編集

こんばんは。「試したこと」を追記し、それぞれの出力結果として「URLだけ」という内容に修正いたしました。ご検討宜しくお願い致します。
bassbone

2018/03/18 11:36

ありがとうございます。
bassbone

2018/03/18 11:41

そもそもpost_custom関数は引数を1つしか取らないようですが、質問文のソースでは引数が2つになっています。ここが原因ではないでしょうか?
kotoritori

2018/03/18 11:46

ご指摘ありがとうございます。「$field_eat = post_custom('field_eat'); 」ですね。失礼しました。ABで試しましたが、やはり相変わらずのようです。
bassbone

2018/03/18 11:51

PHPとWordPressのバージョンはいくつでしょうか?あと何かエラーが出ていたりしませんでしょうか?
kotoritori

2018/03/18 12:09

いずれも最新でして、エラーログはなしです。あ、あと、「試したことA」の「.get_the_terms($post->ID,'fruits')」があると、「URL」だけでなく「Array」という文字がツイートされます。
bassbone

2018/03/18 12:14

get_the_termsは配列が返ってくるので、配列の1番目の要素を取得しないといけないようです。
kotoritori

2018/03/18 12:16

ありがとうございます。初心者向けに言うと、どういうことでしょうか?
bassbone

2018/03/18 12:30

ひとまず「get_the_terms($post->ID,'fruits')」を「implode(',', get_the_terms($post->ID,'fruits'))」とすると結果が変わるのではないでしょうか。
kotoritori

2018/03/18 12:40 編集

AでもBでも、そちらにしますと何もツイートしてくれなくなりました。 ただ、Bの代入する作戦のときに、行の最後に「;」を書き忘れたところ、Arrayがツイートされました。
guest

回答3

0

投稿IDを指定して、「カスタムフィールド」「ターム」「パーマリンク」を取得するには以下の関数を利用します。
戻り値の形式は関数によってそれぞれ違うので、リファレンスを確認の上、foreach等で必要な値を参照してください。

PHP

1$postid = $post[0]->ID; 2 3$meta_values = get_post_meta( $postid, 'field_eat' ); 4$terms = get_the_terms( $postid, 'fruits' ); 5$permalink = get_permalink( $postid ); 6 7var_dump($meta_values); 8var_dump($terms); 9var_dump($permalink);

関数リファレンス/get post meta - WordPress Codex 日本語版
関数リファレンス/get the terms - WordPress Codex 日本語版
テンプレートタグ/get permalink - WordPress Codex 日本語版

PHP: foreach - Manual

投稿2018/03/18 22:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kotoritori

2018/03/19 05:36 編集

ありがとうございます。 >foreach等で必要な値を参照してください。 ですが、echoで出力するという方法ばかりが目につきます。 今回の出力方法は 《A》まず代入して $postid = $post[0]->ID; $meta_values = get_post_meta( $postid, 'field_eat' ); 《B》次に出力する $params = array( 'status' => "{$meta_values}" ); という流れだと思いますが、《A》のステップでforeachを使ってないせいか、《B》をしても「Array」とだけ出力される状態です。 かといって、foreachを使う方法というのは、上述のとおりechoと一緒になっての方法しか検索できなくて、どうしたらいいのか、わかりません。 そこで教えてください。 たとえば上の$meta_valueの場合、foreach等で必要な値を参照するというのは、具体的にはどのような書き方があるのでしょうか?(echoで出力ではなく、《B》で出力したい場合。) お手数おかけして大変申し訳ございません。宜しくお願い致します。 尚、唯一「PHP: foreach - Manual」を拝見したらechoでない方法《A´》が見つかりましたが、次のように書いても何も起こりませんでした。 《A´》まず代入して $arr = array(1, 2, 3, 4); foreach ($arr as $value) { $value = $value * 2; } 《B´》次に出力する $params = array( 'status' => "{$arr}" );
kotoritori

2018/03/19 05:47

foreach ($XXX as $BBB) { ここでechoなどで出力しなくてはならない } というのに対して、今回は、{かっこの中}ではなく、その外にある《B》で出力しなくてはならず、その方法がわからないのです。。
kotoritori

2018/03/19 06:14

失礼します。foreachについてですが、Space-Monkeyさんのご回答により解決いたしました。
退会済みユーザー

退会済みユーザー

2018/03/19 07:19

kotoritoriさんが頭を悩ませているのはWordPressではなく、PHPでの基本的なコードの書き方です。 PHPの基本について勉強しておけば試行錯誤で時間を浪費する必要のない点ですので、PHPの入門者用の書籍を数冊通読して勉強してからWordPressのカスタマイズに挑戦することを強くおすすめします。
guest

0

$post[0]->post_content で本文が出力されている以上、変わった呼び出し方をされている可能性が高いです。コードの断片で無く、呼び出し部分($postへの代入部分)を含めて提示された方がよいでしょう。

また、ツイートする前に表示させてテストしてみてから組み込みましょう。post_customget_the_terms も配列を返すことのある関数です。中身を確認してから使いましょう。

【get_the_terms – WordPress私的マニュアル】
https://elearn.jp/wpman/function/get_the_terms.html

【post_custom – WordPress私的マニュアル】
https://elearn.jp/wpman/function/post_custom.html

投稿2018/03/18 16:01

kei344

総合スコア69400

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

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

kotoritori

2018/03/18 16:45 編集

夜分に失礼致します。ご回答ありがとうございます。代入部分はこのようになっています。 $post = get_posts(array( 'numberposts' => 1, 'post_type' => 'custompost1', 'orderby' => 'rand' )); これは、なにか特徴的なことをしているのでしょうか? 仰るとおり、ツイートする前に通常の出力をさせるべきですね。どこを分離してかけばいいかわからないため、ツイートで試している現状です。余計な情報で失礼しております。 あと、関数についてのリンク先も、どうもありがとうございます。 そうしますと ……「get_the_terms」や「post_custom」以外にも出力方法はいくつかあるが(「get_post_meta」など)、使うものはケースバイケースであって、今回のライブラリにふさわしい出力方法かどうかというのは、ソースを詳しくみないとわからない…… ということでしょうか?
kei344

2018/03/18 16:55

> これは、なにか特徴的なことをしているのでしょうか? コメントに書かれたコードだけでは判断できませんが、おそらくpost_customを使えるコードにはなっていないと思います。また、「$post」「$posts」などはWordPressが使用しているグローバル変数なので、別の変数名にするのが一般的です。 > ・・・ということでしょうか? 「コードの断片で無く、呼び出し部分($postへの代入部分)を含めて提示された方がよいでしょう。」 と回答に書いたとおりです。質問文は編集できるので「追記」されてはいかがでしょうか。(決して元のコードを消さないでください)
kotoritori

2018/03/19 09:45

お世話になっております。ひとまず解決いたしました。ご回答ありがとうございます。これからは質問に記載する情報に気を付けます。
guest

0

ベストアンサー

カスタムフィールドに関してはget_post_metaでは駄目なんでしょうか?
get_post_meta($post->ID,'field_eat')

タームに関してはhttps://teratail.com/questions/117835で理解したのでは?

あと、マルチポストは推奨していません。
タームを出力する方法の種類を募集しています。

とりあえず『なぜそうなのか、なぜそうなるのか』という事を理解しない限り堂々巡りでしょうね。

** 追記**

また頓珍漢してた…

こんな形でいいのでは?

$mypost = get_posts(array( 'numberposts' => 1, 'post_type' => 'custompost1', 'orderby' => 'rand' )); $field_eat = get_post_meta($mypost[0]->ID,'field_eat',true); $fruits = get_the_terms($mypost[0],'fruits'); $fruit_name = ''; foreach( $fruits as $fruit ) { $fruit_name .= $fruit->name; } $params = array( 'status' => "$field_eat"."\n"."$fruit_name"."\n". get_permalink($mypost[0]->ID) );

追伸
wgetで確認しましたか?
https://teratail.com/questions/117503

投稿2018/03/18 15:32

編集2018/03/19 06:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kotoritori

2018/03/18 16:57 編集

ありがとうございます。 $field_eat = get_post_meta($post->ID,'field_eat'); ➡何も表示されませんでした。 $field_eat = get_post_meta($post[0]->ID,'field_eat'); ➡「Array」と表示されました。 タームは今回のお話しとどう繋がるのかわかりませんでしたので、またそちらについてもご提案がありましたら、宜しくお願い致します。 『なぜ「Array」と表示されたり、されなかったりするのか?』 ごめんなさい。わかりません。「Array」の表示は、何を意味するのでしょうか? 検索しても「Arrayと表示される事例」というのが見当たらず、もしよろしければ教えていただけませんでしょうか?
退会済みユーザー

退会済みユーザー

2018/03/19 00:07

> 何も表示されませんでした。 $post->IDが空だから。 >「Array」と表示されました。 $post[0]->IDに値が存在し取得出来たのが配列だから。 だからget_post_metaにtrueを付けると生の値を出します。 $mypost = get_posts(array( 'numberposts' => 1, 'post_type' => 'custompost1', 'orderby' => 'rand' )); $field_eat = getpost_meta($mypost[0]->ID,'field_eat',true); $fruits = get_the_terms($mypost[0],'fruits'); 自分は質問をよく読まなくて頓珍漢な回答をすることがよくありますが、貴方は人の回答の結果しか見てないので同じような質問を繰り返すんです。リファレンスに目を通し何故そうなるのか理解しようとしてませんよね? とりあえず実行結果のみまたはエラーだけ見てるだけでは時間の無駄です。 var_dumpなどを使って変数の中身がどうなっているのか確認しながら進めるのがいいと思います。 http://php.net/manual/ja/function.var-dump.php
kotoritori

2018/03/19 06:06

ありがとうございます。 カスタムフィールド「field_eat」の方はできました。 ターム「fluits」はできませんでした。 複数あるせいでしょうか、タームは別なのでしょうか。引き続き調べてみたいと思います。 var_dumpについてですが、元からあるコードのどこを抜き出せばいいのかわからないので使えません。時間をかけながら少しずつでもやってみます。応援ありがとうございます。
kotoritori

2018/03/19 06:08

いま追記を頂戴したことを知りました。帰ったらやってみて、またそのときにコメントさせてください。なんども本当にありがとうございます。
退会済みユーザー

退会済みユーザー

2018/03/19 06:09

全く応援はしてません。
kotoritori

2018/03/19 06:25

ありがとうございます。タームもできました。 ところで、「リンゴバナナ」でなく「リンゴ、バナナ」にするための方法は、また通常とは異なるのでしょうか? 「explode」というのを使って次のようにしてみたのですが、、 $fruits = get_the_terms($flpost[0],'language_ja'); $fruit_name = ''; foreach( $fruits as $fruit ) { $fruit_name .= $fruit->name; $ar = explode("、", fruits); //こちらを追加 }
退会済みユーザー

退会済みユーザー

2018/03/19 06:53

explode http://php.net/manual/ja/function.explode.php 文字列の配列を返します。この配列の各要素は、 string を文字列 delimiter で区切った部分文字列となります。
kotoritori

2018/03/19 06:56 編集

失礼しました。別の質問にすべきですね。ありがとうございます。 あと追記いただいた追伸ですが、よく意味がわからなかったです??
退会済みユーザー

退会済みユーザー

2018/03/19 07:11

意味が分からないとは? あと、回答貰ってますがwordpress.orgの質問はどうするのですか? 複数のアカウントであちこちで質問するのは自由ですが、マルチポストは推奨されません。 とりあえずもう少し自分で調べる、考える努力も必要かと思います。 例 $fruit_name = ''; $sep = "、"; foreach( $fruits as $fruit ) { if( $fruit !== end( $fruits )){ $fruit_name .= $fruit->name.$sep; }else{ $fruit_name .= $fruit->name; } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問