カテゴリー別アーカイブ: PHP

Advanced Custom Fields(アドバンスドカスタムフィールド)でテキストとタクソノミーの出力とショートコード化

 

アドバンスドカスタムフィールドの出力。
テキスト

<?php if(get_field('フィールド名')): ?>
<p>フィールドラベル:<?php the_field('フィールド名'); ?></p>
<?php endif; ?>

例えば
フィールドラベル⇒商品名
フィールド名⇒product_name の場合

<?php if(get_field('product_name')): ?>
<p>商品名:<?php the_field('product_name'); ?></p>
<?php endif; ?>

タクソノミーの場合。配列なので、foreach。

<?php if(get_field('フィールド名')): ?>
<?php $term = get_field('フィールド名'); ?>
<p>フィールドラベル:<?php
foreach((array)$term as $value) { ?>
<a href="<?php echo get_bloginfo('url') . '/フィールド名/' . $value->slug; ?>"><?php echo $value->name; ?></a>
<?php if(next($term)!==FALSE){ echo ", ";} ?>
<?php } ?>
</p>
<?php endif; ?>

例えば同じく
フィールドラベル⇒商品名
フィールド名⇒product_name の場合

<?php if(get_field('product_name')): ?>
<?php $term = get_field('product_name'); ?>
<p>商品名:<?php
foreach((array)$term as $value) { ?>
<a href="<?php echo get_bloginfo('url') . '/product_name/' . $value->slug; ?>"><?php echo $value->name; ?></a>
<?php if(next($term)!==FALSE){ echo ", ";} ?>
<?php } ?>
</p>
<?php endif; ?>

例えばフィールドラベル⇒国
フィールド名⇒country の場合

これをショートコード化してみる。
テキストの場合

<?php
function tx_parts() {
if(get_field('フィールド名')):
$html .= '<p>フィールド名:' . get_field('フィールド名') . '</p>';
endif;
</code>
<code>
<?php
function tx_parts() {
if(get_field('country')):
$html .= '<p>国:' . get_field('country') . '</p>';
endif;

タクソノミーの場合。

<?php
function tx_parts() {
if(get_field('フィールド名')):
$term = get_field('フィールド名');
$html = '<p>フィールドラベル:';
foreach((array)$term as $value) {
$html .= '<a href="' . get_bloginfo('url') . '/フィールド名/' . $value->slug . '">' . $value->name . '</a>';
if(next($term)!==FALSE){ $html .= ", ";
}
endif;
return $html;
}
add_shortcode('tx', 'tx_parts');

例えばフィールドラベル⇒ブランド
フィールド名⇒brand の場合

?php
function tx_parts() {
if(get_field('brand')):
$term = get_field('brand');
$html = '<p>ブランド:';
foreach((array)$term as $value) {
$html .= '<a href="' . get_bloginfo('url') . '/brand/' . $value->slug . '">' . $value->name . '</a>';
if(next($term)!==FALSE){ $html .= ", ";
}
endif;
return $html;
}
add_shortcode('tx', 'tx_parts');

繋げて複数タクソノミーの出力を一つのショートコードで行う場合。

<?php
function tx_parts() { /*テキストタイプ*/
if(get_field('product_name')):
$html .= '<p>商品名:' . get_field('product_name') . '</p>';
endif;

if(get_field('brand')): /*タクソノミータイプ*/
$term = get_field('brand');
$html .= '<p>ブランド:';
foreach((array)$term as $value) {
$html .= '<a href="' . get_bloginfo('url') . '/brand/' . $value->slug . '">' . $value->name . '</a>';
if(next($term)!==FALSE) $html .= ", ";
}
endif;

if(get_field('country')): /*タクソノミータイプ*/
$term = get_field('country');
$html .= '<p>国:';
foreach((array)$term as $value) {
$html .= '<a href="' . get_bloginfo('url') . '/country/' . $value->slug . '">' . $value->name . '</a>';
if(next($term)!==FALSE) $html .= ", ";
}
endif;

return $html;
}
add_shortcode('tx', 'tx_parts');

エックスサーバーで、htmlのままphpを動かしたい・・・

 

エックスサーバーで、htmlのままphpを動かしたかったのだけど・・・どうしてもできなかった。
公式には.htaccessを以下のように編集すれば可能となっている。

—————————-
AddHandler x-httpd-php .html
—————————-

しかし、これだと真っ白になる。
もちろん、xml宣言にも配慮して<?php echo ‘<?xml version=”1.0″ encoding=”utf-8″?>’.”\n”;?> に書き換えたりもしたけど、変わらず。

サポートに問い合わせても、(X)おかしなところはない、それでできるはず⇒(Me)ならないよ⇒(X)これ以上のサポートはやってないからググって・・・ということで見はなされた。

何回もググってるんだけど・・・。

AddHandler x-httpd-php5.3 .php .phps .html
AddType application/x-httpd-php .php .html

AddHandler x-httpd-php .php .html

AddHandler x-httpd-php5 .php .phps .html

AddHandler application/x-httpd-php .php .html

とか、ぐぐって、出てくる限りのタイプを試したけどダメだった。
文字コードや改行コードもいろいろ試したけど甲斐なし・・・
さくらインターネットもヘテムルもできたのに、エックスサーバだけどうやっても無理・・・。

仕方ないので、結局拡張子を.phpにして.htmlを.phpに301リダイレクトした。
1ページだけだから初めからこうしておけばよかった・・・とも思うけど、できればリダイレクトしないで対応したかった・・・。

 

 

 

 

MTでPHPを動かす方法(.htaccess使用ver)

 

2013/9/5追記
ブルートフォースアタックが猛威を奮っています。
ページや投稿内でPHPが動く状態にしておくと、悪意あるスクリプトなどを埋め込まれた際に被害が拡大する恐れがあります。
非推奨ですので、自己責任でお願いします。

———————————–
Movable Typeはトラウマがあってあんまり好きじゃない。
でもちょっと弄る仕事があるので、メモ。

MTでPHPを使う方法。

方法としてはいくつかあるけど、テンプレートをPHP化すると、勿論URLが変わってしまって、リダイレクトとか面倒だし、SEO上も良くないので、これは却下。

.htaccessに「HTMLファイルでもPHP動きなさいよ」っていう命令を書いてあげる。
記述方法はサーバーによりまちまちなので、使用サーバーに従うべし。

Xサーバー
—————————-
AddHandler x-httpd-php .html
—————————-

ヘテムル
—————————-
AddHandler php4-script .html
※PHP4 を利用したい場合

AddHandler php5-script .html
※PHP5.2 を利用したい場合

AddHandler php5.3-script .html
※PHP5.3 を利用したい場合

AddHandler php5.4-script .html
※PHP5.4 を利用したい場合
—————————-

さくらインターネット
—————————-
※公式には「不可能」
さくらインターネットFAQ参照
なんか以前にPHPの脆弱性がどうとか。
でも調べれば偉い人たちが方法を見つけて教えてくれているのでそちらを参照。
「htaccess php html さくらインターネット」とGoogle先生に聞いて1位だったサイト様
—————————-

今回はヘテムル使用だったけど、これだけでは parse errorが出た。
怒られたのは、1行目。
1行目はXML宣言。
原因はXML宣言もPHPと判断してしまうせいらしいので、XML宣言をPHPで書いてあげれば解決。
このMTではシステムテンプレートにheaderを置いていたので、当該システムテンプレートを編集して完了。
xml1.0のutf-8ならこんな感じ↓

<?php echo'<?xml version="1.0" encoding="utf-8"?>'."n";?>

目次生成コード【PHP】

 

2013/9/5追記
ブルートフォースアタックやWP改ざん等の被害が相次いでいます。
テンプレート以外でPHPを挙動させることはセキュリティ的にリスクを伴いますので、非推奨です。
以下のコードについても、ページ、投稿、ウィジェットで利用する場合はショートコードを作成して利用するようにしてください。
テンプレート以外で利用する場合は自己責任にてお願い致します。
⇒ショートコードの使い方
——————————————-

画像がある場合は画像も一緒に読み込むver。
画RSSが昇順になったような感じ。
index.phpとかに入れたり、ちょっと改造して組み合わせたらサイトマップ生成とかできそう。
sitemapプラグインのddsitemapgenも便利だけど、”いかにも自動生成”だから・・・。

そのうち気が向いたらやってみるかも?

ウィジェットの「投稿目次」でやってみた。
以下投稿目次のコード。

——————————————

<div style=”width: 250px; “>

<?php $posts = get_posts(‘posts_per_page=500&order=ASC&orderby=date’);
$i=0;
foreach($posts as $post) :
setup_postdata($post);
?>

<a href=”<?php echo $post->guid ?>”>
<?php
$images =& get_children( ‘post_type=attachment&post_mime_type=image&post_parent=’.$post->ID);
if ( empty($images) ) {/*画像を使っていない場合*/
} else {
foreach ( $images as $attachment_id => $attachment ) {
$images=array_reverse(array_keys($images));
echo wp_get_attachment_image( $images[0], “thumbnail”);
break;
}
}
?></a>
<p><a href=”<?php echo $post->guid ?>”>● <?php echo $post->post_title ?></a></p>

<?php $i3++; endforeach; ?>

</div>

 

——————————————

 

画像なしでタイトルだけ引っ張ってくるver

——————————————

<div style=”margin-top:20px;margin-left:100px;”>
<?php $posts = get_posts(‘posts_per_page=10&order=ASC&orderby=date’);
foreach($posts as $post) :
setup_postdata($post); ?>
<dd>● <a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></dd>
<?php $i1++; endforeach; ?>
<?php if($i1>=1000){ ?>

<? } ?>
</div>

<p></p>

 

——————————————

 

タイトルだけじゃなくて本文の抜粋を追加したい場合はタイトルひっぱった後にexcerptを入れてあげればOK。

 

前略

<p><a href=”<?php echo $post->guid ?>”>● <?php echo $post->post_title ?></a></p>
<?php the_excerpt(); ?>

後略