• お世話になります。

    カスタム投稿の記事にシリアルナンバーをふりたいとおもっています。
    記事に古い順から「vol.1」「vol.2」というようにしたく、
    こちらのページを参考にしてやってみましたが、
    なぜか途中で番号がつかなかったり、正常に動作しません。

    他に良いやり方があればご教示いただければ幸いです。

    どうぞよろしくお願いいたします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック投稿者 tamakana

    (@tamakana)

    すみません、コード貼り忘れていました。

    /*
     * 特定の投稿タイプにシリアル番号を振るためのクラス
     */
    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 が渡されるので、引数が無い場合の想定は必要なくなります。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「記事にシリアルナンバー をふりたい」には新たに返信することはできません。