投稿ごとに値を設定する (WP)


スポンサーリンク

ページごとにヘッダを変更したいとか、サイドバーに固定内容を表示したいとか、そんなときに有効です。
 

投稿ごとに値を設定する

投稿ページにデータを付加する。
投稿ページに付加したデータを使う。
 

function.php に動作を設定

以下のサンプルを使用。
以下をテキストエディタに取り出し、entry_meta_ の文字列を別の名前に置き換える。
こんな感じで文字列を置き換えるとよいね
置き換える文字:entry_meta_
置き換えられる文字:entry_mypage_
・・・そのままでも構わないけど、複数使う場合にはってことになるかな?いずれ関数名がぶつからないように注意。
※書き換える行をリバースさせています。(この仕様のまま(ページタイトルバナー、ページ毎メッセ)で使うなら触らなくてもいい)
スタートの /***** APPEND YUZUMARU **** とかも変えていいからね?
/************** APPEND YUZUMARU **************
    entry_meta を 自分のファンクション名に置き換える 
    ex entry_meta_ -> my_meta_ 
*/
/* ENTORYの入力領域作成
	エントリー項目を設定
*/
$entry_meta_boxes =	array(
	"サイドボックス" => array(
		"name" => "sidebox",
		"std" => "",
		"title" => "sidebox",
		"type" => "textarea",
		"description" => "▲サイドボックスのリンク集を設定"),
	"画像" => array(
		"name" => "headimg",
		"std" => "",
		"title" => "headimg",
		"type" => "text",
		"description" => "▲ヘッダ画像を入力")
);
/* ここから下は触らなくても大丈夫 (「設定」のところの「エントリーページカスタマイズ」ぐらいかな?)*/
/* function body
	エントリーの表示
*/
function entry_meta_boxes() {
	global $post, $entry_meta_boxes;
	foreach($entry_meta_boxes as $meta_box) {
		$meta_box_value = get_post_meta($post->ID, $meta_box['name'], true);
		if($meta_box_value == "")
		$meta_box_value = $meta_box['std'];
		if($meta_box['type']=='text'){
			echo'<input type="hidden" name="'.$meta_box['name'].'_noncename" id="'.$meta_box['name'].'_noncename" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />';
			echo'<span style="font-weight: bold;">'.$meta_box['title'].' </span>';
			echo'<input type="text" name="'.$meta_box['name'].'" value="'.$meta_box_value.'" size="60" /><br />';
			echo'<p><label for="'.$meta_box['name'].'">'.$meta_box['description'].'</label></p>';
		
		}elseif($meta_box['type']=='textarea'){
			echo'<input type="hidden" name="'.$meta_box['name'].'_noncename" id="'.$meta_box['name'].'_noncename" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />';
			echo'<span style="font-weight: bold;">'.$meta_box['title'].' </span>';
			echo'<textarea name="'.$meta_box['name'].'" cols="60" rows="5"/>'.$meta_box_value.'</textarea><br />';
			echo'<p><label for="'.$meta_box['name'].'">'.$meta_box['description'].'</label></p>';
		}elseif($meta_box['type']=='file'){
			echo'<input type="hidden" name="'.$meta_box['name'].'_noncename" id="'.$meta_box['name'].'_noncename" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />';
			echo'<span style="font-weight: bold;">'.$meta_box['title'].' </span>';
			echo'<input type="file" name="'.$meta_box['name'].'" value="'.$meta_box_value.'" size="60" /><br />';
			echo'<p><label for="'.$meta_box['name'].'">'.$meta_box['description'].'</label></p>';
		}
	}
}

/* 設定 */
function create_entry_meta_box() {
	global $theme_name;

	if ( function_exists('add_meta_box') )
		add_meta_box( 'work-entry_meta-boxes', 
		'エントリーページカスタマイズ', 
		'entry_meta_boxes', 'post', 'normal', 'high' );
}

/* 入力内容を保存 */
function entry_meta_save_postdata( $post_id ) {
	global $post, $entry_meta_boxes;
	foreach($entry_meta_boxes as $meta_box) {
	// Verify
		if ( !wp_verify_nonce( $_POST[$meta_box['name'].'_noncename'], plugin_basename(__FILE__) )) {
			return $post_id;
		}

		if ( 'page' == $_POST['post_type'] ) {
			if ( !current_user_can( 'edit_page', $post_id ))
				return $post_id;
		} else {
			if ( !current_user_can( 'edit_post', $post_id ))
				return $post_id;
		}

		$data = $_POST[$meta_box['name']];

		if(get_post_meta($post_id, $meta_box['name']) == "")
			add_post_meta($post_id, $meta_box['name'], $data, true);
		elseif($data != get_post_meta($post_id, $meta_box['name'], true))
			update_post_meta($post_id, $meta_box['name'], $data);
		elseif($data == "")
			delete_post_meta($post_id, $meta_box['name'], get_post_meta($post_id, $meta_box['name'], true));
	}
}
add_action('admin_menu', 'create_entry_meta_box');
add_action('save_post', 'entry_meta_save_postdata');
/************** /APPEND YUZUMARU **************/
 

ENTORYの入力領域作成 部分の設定内容

前出のソースの記事にぶら下げるデータ項目の設定は、以下のような意味になります。
/* ENTORYの入力領域作成
	エントリー項目を設定
*/
$entry_meta_boxes =	array(
	"サイドボックス" => array(	←項目名
		"name" => "sidebox",	←変数名(項目のプログラム内部での呼び名)
		"std" => "",			←初期値
		"title" => "sidebox",	←エントリー時のタイトル
		"type" => "textarea",	←エントリータイプ (text , textarea)
		"description" => "▲サイドボックスのリンク集を設定"),	←エントリー時の説明(次の項目を続けて書くのでカンマ区切り)
		:
		:
		"description" => "▲ヘッダ画像を入力")	←最後カンマが付いていないことに注意
);
 

設定した内容を使う

$sidebox=get_post_meta($post->ID, '変数名', true); 
 
変数 sidebox に値が取り出されます。
 
使用サンプル
$sidebox=get_post_meta($post->ID, 'sidebox', true);
if( $sidebox!=''){
    echo $sidebox;
}
 
投稿データに対してぶら下がっている値なのでポストループ内で使用しないと、値を取ってこれないことに注意。
つまり、index.php の ヘッダとかではポストデータループの外なので値はぶら下がっていないってこと。
 

ページごとにヘッダ画像を変える (サンプル)

head.php
<div id="ptitle" class="site-title">
<?php
$headimg=get_post_meta($post->ID, 'headimg', true); 
if($headimg!=''){
?>
<img src="<?php echo $headimg; ?>" alt="<?php bloginfo('name'); ?>" title="<?php bloginfo('name'); ?>">
<?php
}else{
?>
<!--<a href="<?php bloginfo('url'); ?>">-->
<img src="<?php echo $web_logo; ?>" alt="<?php bloginfo('name'); ?>" title="<?php bloginfo('name'); ?>">
<!--</a>-->
<?php
}
?>
 

ページごとにサイドバーにコメントを表示する (サンプル)

sidebar.php
<div id="sidebar">

<?php
$sidebox=get_post_meta($post->ID, 'sidebox', true); 
$plugin_url=plugins_url();
if($sidebox!=''){
$sidebox=str_replace('<?php echo plugins_url(); ?>',$plugin_url,$sidebox);
?>
<div style="height:20px;"></div>
<div class="sidebar-wrapper">
<h4>最近の投稿</h4>
<ul style="list-style: none;">
	<li><?php echo $sidebox; ?></li>
</ul>
</div>
<?php
}
?>

<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('サイドバー') ) : ?>
<?php endif; ?>

</div><!-- /#sidebar -->
 

固定ページにも設定する

create_entry_meta_box()のところに ‘page’ ってやつを追加してやればいい。
逆に固定ページだけ必要なら ‘post’ の方を消せばいい。
以下は、投稿ページのエントリーにも固定ページのエントリーにも対応する場合の例。
/* 設定 */
function create_entry_meta_box() {
	global $theme_name;

	if ( function_exists('add_meta_box') ){
		add_meta_box( 'work-entry_meta-boxes', 
		'エントリーページカスタマイズ', 
		'entry_meta_boxes', 'post', 'normal', 'high' );

		add_meta_box( 'work-entry_meta-boxes', 
		'エントリーページカスタマイズ', 
		'entry_meta_boxes', 'page', 'normal', 'high' );
	}
}

スポンサーリンク