すみません、コード貼り忘れていました。
/*
* 特定の投稿タイプにシリアル番号を振るためのクラス
*/
class NumberField {
protected $_postType; // 採番対象の投稿タイプ名
public function __construct( $post_type = 'post' ) {
$this->_postType = $post_type;
add_action( 'save_post_' . $this->_postType, array( $this, 'setNumber' ) );
}
/*
* 番号を格納するカスタムフィールドのキーを返す
*/
protected function _getMetaKey() {
return 'number_field_' . $this->_postType;
}
/*
* 採番用シーケンスを格納するサイトオプションのキーを返す
*/
protected function _getSequenceKey() {
return 'number_sequence_' . $this->_postType;
}
/*
* 当該投稿タイプが投稿されたら番号を付与する
*/
public function setNumber( $post_ID ) {
// 採番済みならば何もしない
if ( $this->getNumber() !== '' )
return;
// 採番用シーケンスが既存の場合は1進める。ない場合は1から始める。
$sequence = get_option( $this->_getSequenceKey() );
$sequence = ( !empty( $sequence ) ) ? $sequence + 1 : 1;
// カスタムフィールドに番号を追加する
if ( update_post_meta( $post_ID, $this->_getMetaKey(), $sequence ) ) {
// カスタムフィールドの更新に成功したら、シーケンスをオプションに格納する
update_option( $this->_getSequenceKey(), $sequence );
}
}
/*
* 引数で指定された投稿 ID の持つ番号を取得する
*/
public function getNumber( $post_ID = null ) {
// 引数がなければ現在の投稿 ID を使う
if ( empty( $post_ID ) ) {
$post_ID = get_the_ID();
}
return get_post_meta( $post_ID, $this->_getMetaKey(), true );
}
}
$numberField = new NumberField( '投稿タイプ' ); // 採番対象の投稿タイプ名を指定する
$postNumberField = new NumberField(); // デフォルトでは投稿タイプ「投稿」に番号を振る
こんにちは
参考にされたサイトを見ていませんし、詳細にデバッグなどしたわけではありませんが、ちょっとおかしげなところを見つけました。
public function setNumber( $post_ID ) {
// 採番済みならば何もしない
if ( $this->getNumber() !== '' )
return;
という箇所ですが、setNumber には必ず $post_ID が渡されているので、$this->getNumber() へは $post_ID を渡すべきと思います。
また、ちょっと細かくて不具合とは関係無いかもしれませんが、setNumber と getNumber は public な関数に定義されていますが、このクラスがインスタンス化されるときに post_type は決定されています。
投稿タイプと矛盾する $post_ID がこれらの関数に渡されたときの動作が想定されていませんので、これらの関数は private か protected にすべきと思います。
そうなってくると、getNumber には常 $post_ID が渡されるので、引数が無い場合の想定は必要なくなります。