wordpressの別記事内容を、まるっと引用して使う

パーマリンクを複数置きたいとかそういうとき、
プログラムで複数設定する他に、同じ内容の記事を作るという方法がある。

その場合において、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にして分割数を変えるでもいいとは思う。

コメント

タイトルとURLをコピーしました