サポート » 使い方全般 » 既投稿済み記事の更新

  • 解決済 typista

    (@typista)


    WordPressでCMS運用しているサイトで、既に投稿済みの記事(postでもpageでも)を、公開したまま、裏側でコピーして、指定日時で差し替え予約するような妙案または、近しいプラグイン(改修することも可)はありませんでしょうか?リビジョン機能を上手く使えると良いなぁと思ったりしています。

    コピーだけなら、Duplicate Postで可能ですが、差し替え予約をどのようにしようか思案しています。
    既存別記事等からのリンクもありますので、記事ID or スラッグ(パーマリンク)運用している場合なども考慮しなければです。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • ここ読むとコアの大幅な改造が必要っぽいですね。
    #ページ機能の話しですが投稿も同じだと認識

    軽く探してみましたがプラグインは無かったです。
    現状では諦めるか他CMS(OpenCMSとか)は可能なのでできるほうに乗り換え検討もありかと。

    自分でWordPressを使って実現するにはかなりの工数が必要になりそうですね。
    #非現実的っぽい感じも・・・。

    あくまでも素人意見なので詳しい人に期待

    1. カスタムフィールドに、日時、差し替え用テキスト、を入れておく
    2. 日時が来たら本文を差し替え用テキストに変更

    ならプラグインで実装できると思います。ただしカスタムフィールドにデータを入れるとなると、実際に運用する人の手間が結構かかりそうです。

    以下を functions.php に追加して
    メタBOXに更新予約日時を設定して
    ループ内で <?php echo my_get_content(); ?>
    とすると、それらしく動作します(ページについては未検証)。

    更新予約日時を変更して保存すると、どんどん予約できます。
    更新予約日時を変更しないで保存すると、最新の予約日時分が有効になります。

    $fu_key = 'futureupdate';
    
    function my_get_content(){
      global $post, $fu_key;
    
      $now = date('Y-m-d H:i');
      $update = get_post_meta($post->ID, $fu_key, true);
      if($update && $update <= $now)
        return get_the_content();
    
      $args = array(
        'order' => 'DESC',
        'orderby' => 'ID',
        'post_parent' => $post->ID,
        'post_type' => 'revision',
        'post_status' => 'inherit',
        'meta_key' => $fu_key,
        'meta_value' => $now,
        'meta_compare' => '<='
     );
      if($revisions = get_children($args))
        foreach($revisions as $revision)
          return $revision->post_content;
    
      return 'No content.';
    }
    //meta_box追加
    function my_meta_futureupdate_box(){
      add_meta_box('my_meta_futureupdate_box', '更新予定日時の指定', 'my_meta_futureupdate_html', 'post', 'normal', 'high');
      add_meta_box('my_meta_futureupdate_box', '更新予定日時の指定', 'my_meta_futureupdate_html', 'page', 'normal', 'high');
    }
    function my_meta_futureupdate_html($post, $box){
      global $fu_key;
    
      $value = get_post_meta($post->ID, $fu_key, true);
      if(!$value) $value = '';
      echo '<input type="hidden" name="my_meta_futureupdate_nonce" id="my_meta_futureupdate_nonce" value="'.wp_create_nonce(get_bloginfo('template_url') . $fu_key).'" />'."\n"
         . '<div><label for="futureupdate">更新予定日時(YYY-MM-DD HH:II)</label>'."\n"
         . '<input type="text" name="futureupdate" value="'. $value  .'" size="50" /></div>'."\n";
    }
    function my_meta_futureupdate_update($post_id){
      global $fu_key;
    
      if(!wp_verify_nonce( $_POST['my_meta_futureupdate_nonce'], get_bloginfo('template_url') . $fu_key)){
        return $post_id;
      }
      if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        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;
      }
    
      if($parent_id = wp_is_post_revision($post_id)){
        $old = get_post_meta($parent_id, $fu_key, true);
        if($old)
          update_metadata('post', $post_id, $fu_key, $old);
      }else{
      if(isset($_POST[$fu_key]))
        update_metadata('post', $post_id, $fu_key, $_POST[$fu_key]);
      }
    }
    add_action('admin_menu', 'my_meta_futureupdate_box');
    add_action('save_post', 'my_meta_futureupdate_update');

    リビジョンにメタデータを持たせています(WordPress 基本思想外)。

    以下については、よきにはからってください。
    ・更新予約日時が不要/未指定の場合。
    ・更新予約日時をイカした UI にしたい。
    ・抜粋はどうすんだ。
    ・副作用があるんじゃないのか。

    kzさん
    ありがとうございます。
    すばらしいです!
    元々、WordPressに足りない機能なので「基本思想外」は覚悟してます。
    求めていたものには、ほぼ完璧な解決方法です。

    if($update && $update <= $now)

    if(!$update || ($update && $update <= $now))
    が正解でした。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「既投稿済み記事の更新」には新たに返信することはできません。