パーマリンクを複数置きたいとかそういうとき、
プログラムで複数設定する他に、同じ内容の記事を作るという方法がある。
その場合において、1個書き直したら、同じ内容を合わせて書き直すとかメンドクサイ。
もう内容持ってきちゃおう!て方法。
ブログ内検索にはかからなくなるけど、同じ記事だしいいよね!
呼び出すには、記事内でPHPを使用するためのプラグインを使って実行する。
入れてない人は入れて、入れたくない人は回れ右ですな
基本的なやり方
<?php
// 記事ID。今回は仮に『4』
$post_id = 4;
//指定した記事IDの情報を取得する
$post = get_post($post_id, 'OBJECT' , 'raw');
// more前、more後に分割
$post_include = explode('<!-'.'-more-'.'->', $post->post_content ,2);
// more前呼び出し
echo $post_include[0];
?>
<!--more-->
<?php
// more後呼び出し
echo $post_include[1];
?>
フィルターかける
何か思っていたフィルターが、かかっていないなというときは
echo ExecPhp_Runtime::filter_user_content($post_include[0]);
のように、使いたいフィルター関数を直接実行する。
気持ち的には、上記よりも
echo apply_filters( 'the_content',$post_include[0]);
のように、記事本文をフィルターフックしたいところだが、『more』付近で想定外のことになる。
詳しくは調べてはいないので、原因は不明。
でもPHP実行プラグインの後のフィルターは通常通りかかっているわけだから、その辺の可能性は高い。
変数の引き渡しは難しい
処理が同じだし、変数だけ渡してしまいたい処理があるとして、処理が渡せない。
例えば、元記事の『元々』と表示させる部分を『書き換え』にしたいとする。
参照元記事:id=10
<?php if(!isset($aaa)) $aaa = '元々'; } echo $aaa ?>
使用する側
<?php
$aaa = '書き換え';
$post_id = 10;
$post = get_post($post_id, 'OBJECT' , 'raw');
$post_include = explode('<!-'.'-more-'.'->', $post->post_content ,2);
echo ExecPhp_Runtime::filter_user_content($post_include[0]);
?>
結果
元々
PHPの処理のタイミングが違うから、こうなってしまう。
だから一緒にするには、同じタイミングで実行させるしかない。
文字列にして一緒に渡してしまうのである。
$tmp = "$aaa = '書き換え';".$post_include[0]; echo ExecPhp_Runtime::filter_user_content($tmp);
カンタンな変数ならいいけど、配列だとしんどい。
応用編
前半に登録していた変数を後半にも使っていて、真ん中だけ文章を変えたいとする。
参照元記事:id=11
<?php $array = array( b => '前', a => '後', ); echo $array[b]; ?> <!--more--> 元々の記事の内容 <!-- matome --> <?php echo $array[a]; ?>
使用する側
<?php
$post_id = 11;
$post = get_post($post_id, 'OBJECT' , 'raw');
$post_include = explode('<!-'.'-more-'.'->', $post->post_content ,2);
$post_include2 = explode('<!-'.'- matome -'.'->', $post_include[1] ,2);
$tmp = ExecPhp_Runtime::filter_user_content($post_include[0].'<!-'.'- matome -'.'->'.$post_include2[1]);
$post_include3 = explode('<!-'.'- matome -'.'->', $tmp ,2);
echo $post_include3[0];
?>
<!--more-->
この記事用の内容。
<?php
echo $post_include3[1];
?>
つまり別の文字列で分割するわけでありますな。
moreは1回しか聞かないからmoreにして分割数を変えるでもいいとは思う。


コメント