サポート » 使い方全般 » 下書き投稿の際にアクションを起こしたい

  • 現在投稿公開時のみに処理を行うようにこのようにfunction.phpに記載しているのですが

    ////////////////////////////////////////////////////////////
    // Create Number4
    ////////////////////////////////////////////////////////////
    function number4($intno) {
        return str_repeat('0',4-strlen($intno)).$intno;
        }
    
    function plustar_published_post($post_id , $post)
    {
      if(
       (($_POST["original_post_status"] == 'draft' || $_POST["original_post_status"] == 'auto-draft' )
      && $_POST["hidden_post_status"] == 'draft'
      && $_POST["originalaction"] == "editpost")
      || (!isset($_POST["original_post_status"])
      &&  !isset($_POST["hidden_post_status"])
      &&  !isset($_POST["originalaction"])
      && $post->post_status == "publish"))
      {
        // 公開時の処理
          $path = ("カウント用ファイルのパス");
          $count_file = $path;
        $file = fopen($count_file,"r+");
    
        $count = explode(',',fgets($file));
        rewind($file);
    
        flock($file,LOCK_EX);
    
        if($count[0] == date('ymd')) {
            $count[1]=intval($count[1])+1;
            } else {
            $count[0]=date('ymd');
            $count[1]="1";
            }
        $date=$count[0].",".intval($count[1]);
        fputs($file,$date);
        flock($file,LOCK_UN);
    
        fclose($file);
    
       return date("ymd").number4(intval($count[1]));
      }
    }
    
    add_action('publish_post', 'plustar_published_post',1,2);

    これを最初の下書き保存の時のみにしたいです。
    具体的な動作としてはカスタムフィールドを使用して
    個別記事に管理番号をつけています。
    (日付+数字)

    そのために下書き保存をした際に数字部分のカウントが上がるようにしています。
    ただ、公開時にしていたのですが下書きを行なって別記事を投稿しようとすると
    管理番号が重複してしまうため、下書き時に一度だけカウントするようにしたいです。

    あまりWordPressに詳しくは無いのですが
    どなたかご教授いただけませんでしょうか。

    よろしくお願いいたします。

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

    (@hideyoshi31)

    色々自分で調べてみたのですが、

    add_action(‘publish_post’, ‘plustar_published_post’,1,2);

    のpublish_postが公開時にアクションを起こすという事は理解しました。

    これが下書きを行った際にアクションを起こすようにするにはどうすればいいでしょうか。

    上の条件部分は自分でなんとかします。

    モデレーター gatespace

    (@gatespace)

    こんにちは。
    考え方だけですが。

    transition_post_status という投稿ステータスが変更された時に呼ばれるアクションフックがあります。
    そのときに「投稿ステータスが下書きで特定のカスタムフィールドの値が空」という条件で処理を行えば良いと思います。

    add_action( 'transition_post_status' , 'transition_post_status_draft');
    funtion transition_post_status_draft ($new_status, $old_status, $post) {
        $post_kanri = get_post_meta($post->ID, 'post_kanri', true); // カスタムフィールド「post_kanri」を取得
        if( ($new_status == 'draft') and !$post_kanri) {
            // ステータスが下書きかつカスタムフィールド「post_kanri」がからの時の処理
            $kanriID = "管理番号"; //この辺はご自分で
            update_post_meta($post->ID, 'post_kanri', $kanriID); //カスタムフィールドの値を保存
        }
    }
    トピック投稿者 hideyoshi31

    (@hideyoshi31)

    gatespace様

    ご返答いただき有難うございます!
    教えていただいた方法でやってみましたところ
    下書き保存時にアクションを起こす事が出来ました。

    ただ、再度下書き保存を行うとカウントが上がってしまいます。
    色々調べてみたのですが、「管理番号がからの時」という点に問題があるようでした。

    $post_kanri に擬似的に数字等を代入すると
    カウントは上がりませんでした。

    また、

    $kanriID = "管理番号"; //外部ファイルから数字を取得
    print $kanriID;

    とすると番号は表示されました。

    以上の事から

    $post_kanri = get_post_meta($post->ID, 'post_kanri', true); // カスタムフィールド「post_kanri」を取得

    の時に値を取得出来ていない事が原因ではないかと推測しています。

    度々申し訳ございませんが何か解決方法はありませんでしょうか。

    モデレーター gatespace

    (@gatespace)

    ちょっと私も検証できないのでアレですが、

    $post_kanri = get_post_meta($post->ID, 'post_kanri', true); // カスタムフィールド「post_kanri」を取得

    のあとに

    wp_die( var_dump($post_kanri) );

    っていれるとどうなります?

    トピック投稿者 hideyoshi31

    (@hideyoshi31)

    お返事有難うございます。

    記事の新規追加を押した際に

    bool(false)

    と表示されるようになりました。

    モデレーター gatespace

    (@gatespace)

    記事の新規追加を押した際に

    bool(false)

    と表示されるようになりました。

    これで 新規の時は$post_kanri が空 = カスタムフィールドの「post_kanri」が空、ということですので、条件文を直せば良いだけかと。
    未検証ですが
    if( ($new_status == 'draft') and empty($post_kanri))
    とかじゃだめですかね?

    トピック投稿者 hideyoshi31

    (@hideyoshi31)

    ご返答有難うございます。

    実は既に

    if( ($new_status == 'draft') and empty($post_kanri))

    は検証済みなのですが、ダメでした。

    $post_kanri = get_post_meta($post->ID, 'post_kanri', true); // カスタムフィールド「post_kanri」を取得

    の後に

    print $post_kanri."test";

    を追記してチェックしたのですが
    一度下書き保存をした記事で再度保存を行った際に表示されたのは
    test
    という文字だけで$post_kanriが空になっているということが分かりました。

    現状分かっている事として
    update_post_meta($post->ID, 'post_kanri', $kanriID); //カスタムフィールドの値を保存

    によってカスタムフィールドに値が保存されていないようです。

    ここに何かポイントがあるような気がするのですが。。。

    ご迷惑をおかけして申し訳ございません。

    横からですが、’$post’が渡っていないから’$post->ID’のカスタムフィールドへの保存に失敗しているのだと思います。
    渡される引数はデフォルトで1つですので、次のようにする必要があります。
     

    add_action( 'transition_post_status' , 'transition_post_status_draft', 10, 3);

      
    関数リファレンス/add action – Codex 日本語版

    モデレーター gatespace

    (@gatespace)

    popupさん、フォローありがとうございます。
    これでどうですかね。(一応検証しました)

    add_action( 'transition_post_status' , 'transition_post_status_draft', 10, 3);
    function transition_post_status_draft ($new_status, $old_status, $post) {
        $post_kanri = get_post_meta($post->ID, 'post_kanri', true); // カスタムフィールド「post_kanri」を取得
        if( ($new_status == 'draft') and !$post_kanri) {
            // ステータスが下書きかつカスタムフィールド「post_kanri」がからの時の処理
            $kanriID = "管理番号"; //この辺はご自分で
            update_post_meta($post->ID, 'post_kanri', $kanriID); //カスタムフィールドの値を保存
        }
    }

    DB上で「post_kanri」というカスタムフィールドの値が保存されていることは確認できます。

    テンプレートファイル上で使う場合は get_post_meta で表示できますが、
    ダッシュボードの記事一覧や投稿の編集画面上でこの値を確認するのであれば、
    別途加工が必要です。

    トピック投稿者 hideyoshi31

    (@hideyoshi31)

    popup様
    gatespace様

    ご返答いただき有難うございます。
    ご教授いただきました方法に書き換えた所、
    理想通りの物が作成出来ました!

    初めてこのフォーラムに投稿させていただきましたが
    皆様の助けをお借りすることが出来て本当に嬉しく思います。

    心より御礼申し上げます。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「下書き投稿の際にアクションを起こしたい」には新たに返信することはできません。