サポート » 使い方全般 » 記事を修正した時に更新日時(modified_time)を変更せずに保存する方法はな

  • 解決済 swcn

    (@swcn)


    情報ページの一覧を更新日時順に表示しています。

    通常の更新時はトップに表示されるのはもちろんいいのですが、ちょっとした手直しなどでトップに表示させたくありません…

    なのでちょっとした更新の時は更新日時(modified_time)を変更せずに保存するなどの方法はありませんでしょうか?

    皆様のお知恵をお貸しください。よろしくお願いします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • save_postsにフックして更新日時を投稿日時に変更すればいいようなきもしますが
    それよりも表示の順番や表示する内容を更新日時ではんかう投稿日時に変えたほうが早いような気がします。

    トピック投稿者 swcn

    (@swcn)

    gogowebさん、コメントありがとうございます。

    新着情報と更新情報を一緒に表示させ、新着記事には新着アイコンを付け、更新時には更新アイコンを付けてトップに表示するようにさせているので、投稿日時ではちょっとうまくないのです…

    理想は更新ボタンを2つ設置し、片方を通常更新、片方は更新日時を変更せずに更新する、などの案はあるのですがなかなか実装まではいけません…

    投稿直前の投稿データはwp_insert_post_dataで取得することができるので

    add_filter('wp_insert_post_data','my_insert_post_data',10,2);
    function my_insert_post_data($data, $postarr){
    	if(条件文){
    		unset($data["post_modified"]);
    		unset($data["post_modified_gmt"]);
    	}
    	return $data;
    }

    で更新日時を変更せずに更新できると思います。

    トピック投稿者 swcn

    (@swcn)

    gogowebさん、ありがとうございます。

    試してみようと思ったのですが、ifの条件文になにを入れればよいか思いつきませんでした…

    例えばで良いので何かありますでしょうか?

    よろしくお願いします。

    ボタンを2つ用意するというのなら片方のボタンのパラメータを与えるとか
    新しくメタボックスを追加してそこに更新かそのままかのチェックを用意してそれを取得するとかはどうでしょうか?

    トピック投稿者 swcn

    (@swcn)

    gogowebさん、アドバイスありがとうございます。

    アドバイスを元に新しくメタボックスを追加して「手直し」か「更新」かの値を取得する方法にしてみました。

    下記のコードで今のところうまく動いてくれているのですが、何かよくない所があればご指摘いただきたいです。

    よろしくお願いします。

    /*管理画面が開いたときに実行*/
    add_action( 'admin_menu', 'add_update_level_custom_box' );
    /*更新ボタンが押されたときに実行*/
    add_action( 'save_post', 'save_custom_field_postdata' );
    
    /* カスタムフィールドを投稿画面に追加 */
    function add_update_level_custom_box() {
        //ページ編集画面にカスタムメタボックスを追加
        add_meta_box( 'update_level', '更新レベル', 'html_update_level_custom_box', 'post', 'side', 'high' );
    }
    
    /* 投稿画面に表示するフォームのHTMLソース */
    function html_update_level_custom_box() {
        $update_level = get_post_meta( $_GET['post'], 'update_level' );
    
        echo '<div style="padding-top: 3px; overflow: hidden;">';
        echo '<div style="width: 80px; float: left;"><input name="update_level" type="radio" value="none" ';
        if( $update_level[0]=="" || $update_level[0]=="none" ) echo ' checked="checked"';
        echo ' />未指定</div><div style="width: 80px; float: left;"><input name="update_level" type="radio" value="low" ';
        if( $update_level[0]=="low" ) echo ' checked="checked"';
        echo ' />手直し<br /></div><div style="width: 80px; float: left;"><input name="update_level" type="radio" value="high" ';
        if( $update_level[0]=="high" ) echo ' checked="checked"';
        echo '/>更新<br /></div>';
        echo '</div>';
    }
    
    /* 設定したカスタムフィールドの値をDBに書き込む記述 */
    function save_custom_field_postdata( $post_id ) {
        $mydata = $_POST['update_level'];
        if( "" == get_post_meta( $post_id, 'update_level' )) {
            /* update_levelというキーでデータが保存されていなかった場合、新しく保存 */
            add_post_meta( $post_id, 'update_level', $mydata, true ) ;
        } elseif( $mydata != get_post_meta( $post_id, 'update_level' )) {
            /* update_levelというキーのデータと、現在のデータが不一致の場合、更新 */
            update_post_meta( $post_id, 'update_level', $mydata ) ;
        } elseif( "" == $mydata ) {
            /* 現在のデータが無い場合、update_levelというキーの値を削除 */
            delete_post_meta( $post_id, 'update_level' ) ;
        }
    }
    
    /* 「更新」以外は更新日時を変更しない */
    add_filter('wp_insert_post_data','my_insert_post_data',10,2);
    function my_insert_post_data( $data, $postarr ){
        $mydata = $_POST['update_level'];
    	if( $mydata != "high" ){
    		unset( $data["post_modified"] );
    		unset( $data["post_modified_gmt"] );
    	}
    	return $data;
    }
    トピック投稿者 swcn

    (@swcn)

    更新時更新時とばかり考えていたので新規投稿時のことを忘れてました…

    上のコードでは新規投稿時は更新日時が0になってしまうので、

    $mydata != "high"

    のところを

    $mydata == "low"

    にしました。

    トピック投稿者 swcn

    (@swcn)

    最終的にこのようにしました。

    /*管理画面が開いたときに実行*/
    add_action( 'admin_menu', 'add_update_level_custom_box' );
    /*更新ボタンが押されたときに実行*/
    add_action( 'save_post', 'save_custom_field_postdata' );
    
    /* カスタムフィールドを投稿画面に追加 */
    function add_update_level_custom_box() {
        //ページ編集画面にカスタムメタボックスを追加
        add_meta_box( 'update_level', '更新レベル', 'html_update_level_custom_box', 'post', 'side', 'high' );
    }
    
    /* 投稿画面に表示するフォームのHTMLソース */
    function html_update_level_custom_box() {
        $update_level = get_post_meta( $_GET['post'], 'update_level' );
    
        echo '<div style="padding-top: 3px; overflow: hidden;">';
        echo '<div style="width: 100px; float: left;"><input name="update_level" type="radio" value="high" ';
        if( $update_level[0]=="" || $update_level[0]=="high" ) echo ' checked="checked"';
        echo ' />通常更新</div><div style="width: 100px; float: left;"><input name="update_level" type="radio" value="low" ';
        if( $update_level[0]=="low" ) echo ' checked="checked"';
        echo '/>修正のみ<br /></div>';
        echo '</div>';
    }
    
    /* 設定したカスタムフィールドの値をDBに書き込む記述 */
    function save_custom_field_postdata( $post_id ) {
        $mydata = $_POST['update_level'];
        if( "" == get_post_meta( $post_id, 'update_level' )) {
            /* update_levelというキーでデータが保存されていなかった場合、新しく保存 */
            add_post_meta( $post_id, 'update_level', $mydata, true ) ;
        } elseif( $mydata != get_post_meta( $post_id, 'update_level' )) {
            /* update_levelというキーのデータと、現在のデータが不一致の場合、更新 */
            update_post_meta( $post_id, 'update_level', $mydata ) ;
        } elseif( "" == $mydata ) {
            /* 現在のデータが無い場合、update_levelというキーの値を削除 */
            delete_post_meta( $post_id, 'update_level' ) ;
        }
    }
    
    /* 「更新」以外は更新日時を変更しない */
    add_filter( 'wp_insert_post_data', 'my_insert_post_data', 10, 2 );
    function my_insert_post_data( $data, $postarr ){
        $mydata = $_POST['update_level'];
    	if( $mydata == "low" ){
    		unset( $data["post_modified"] );
    		unset( $data["post_modified_gmt"] );
    	}
    	return $data;
    }
8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「記事を修正した時に更新日時(modified_time)を変更せずに保存する方法はな」には新たに返信することはできません。