• 解決済 formless

    (@formless)


    いつもお世話になっております。
    この度、投稿もしくはページが、保存or公開される際に、
    特定の条件下で投稿/ページの保存or公開を無効にする方法を探しております。
    例えば、
    ・特定の時間外の投稿
    ・特定の文字列入っている投稿/ページ
    ・前の投稿日時から特定の期間(例:24時間)が経っていない投稿
    というような、分岐条件部分だけは、自作出来そうなのですが、
    肝心の『保存or公開を無効に(破棄)する方法』が分からないのです。
    add_action(‘publish_post’, ‘アクション関数名’);
    もしくは
    add_action(‘publish_page’, ‘アクション関数名’);
    のような形で、function.phpに書き込んで使いたいと思っています。
    (最終的にはPlugin化出来ればとは思っています)

    ちょっとしたヒントでも結構ですので、アクション関数内で、保存や公開を破棄する簡単な方法がありましたら、情報を頂けますと幸いです。

    お忙しいところを大変恐縮ですが、
    お付き合いの程、どうぞ宜しく御願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • 保存を破棄はアレなので、「公開」できないようにしてみました。
    ※非公開なら保存できます。

    function my_transition_post_status($new_status, $old_status, $post){
      if($new_status == 'publish'){
        if(特定の条件)
          wp_die('公開できませんよ');
        }
      }
    }
    add_action('transition_post_status', 'my_transition_post_status',  1, 3);

    トピック投稿者 formless

    (@formless)

    kzさん、お返事をどうも有り難うございます。
    ※申し遅れましたが、こちらの環境は、Wordpress2.7.1&Coreserverです。

    早速、いただいたCODEを以下のようにアレンジしてfunctions.phpに仕込んでみました。

    function my_transition_post_status($new_status, $old_status, $post){
    	if($new_status == 'publish'){
    		$count_posts=wp_count_posts()->publish;
    		if ($count_posts > 10) {
    		wp_die('Limit Over! ('.$count_posts.')' );
        	}
      }
    }
    add_action('transition_post_status', 'my_transition_post_status',  1, 3);

    この状態で新規に投稿すると、公開済み投稿数が10以上なので、きちんと警告画面が表示されますが、実際には保存&公開がなされてしまっています。
    add_actionの優先順位を1で、wp_dieを使っても,その後の処理はなされてしまうのでしょうか?もしくは、アクションは、functions.phpにいれても、保存/公開処理の後に実行されることになってしまうのでしょうか?
    コアを理解しないままでの質問で、とんちんかんなことを言っているかもしれません事をお許し下さい。

    引き続き、お付き合いいただければ幸いです。
    どうぞ宜しく御願いいたします。

    $my_post = array();
    $my_post['ID'] = $post->ID;
    $my_post['post_status'] = 'private';
    wp_update_post($my_post);

    条件に合致したら非公開に切替えてしまってはどうでしょう?

    トピック投稿者 formless

    (@formless)

    shokun0803様
    お返事をどうも有り難うございます。

    wp_die('Limit Over! ('.$count_posts.')' );

    のところを

    $my_post = array();
    $my_post['ID'] = $post->ID;
    $my_post['post_status'] = 'private';
    wp_update_post($my_post);
    wp_die('Limit Over ('.$count_posts.') につき、非公開扱いになります。');

    としたところ、”新規投稿⇒公開”でも、”非公開投稿⇒公開”でも、等しく、エラーメッセージが出て、強制非公開扱いとなりました。アドバイスをどうも有り難うございます!

    ただ、今更なのですが、このままですと、ページの公開も、強制非公開扱いとなるようになってしまいました。ページの場合には、この判定をスルーするようにするには、どこにどのような分岐を加えれば良いでしょうか。

    また、もといになりますが、投稿を強制削除出来るような関数はないのでしょうか。
    投稿ルールに反している内容が非公開でもDBに溜まって行くのは、あまり気持ちが良いものではないので。。。

    お手隙の際に、もう少しお付き合い頂ければ幸いです。
    どうぞ宜しく御願いいたします。

    $post->post_type == 'post'
    を判定に加えてみてはいかがでしょう。

    削除するならwp_delete_postですけどね。

    トピック投稿者 formless

    (@formless)

    shokun0803様
    再び、アドバイスをどうも有り難うございます。
    判定部分、処理部分を以下のようにしました。

    if ($count_posts > 10 && $post->post_type == 'post') {
    		wp_delete_post($post->ID);
    		wp_die('Limit Over! ('.$count_posts.') につき、削除しました。<br />&raquo;<a href="'.get_bloginfo('url').'/wp-admin/edit.php">投稿一覧</a>');
    }

    これで、意図した通りに、条件に合致した投稿のみを強制削除出来るようになりました。また、plugin化しても使える事も確認しました。

    こうして作ってみると、wp_dieでエラー画面を表示して投稿リストへのリンクを表示するよりは、投稿編集画面に戻った時に赤枠でエラーメッセージが出る方が親切だなぁと思い、色々調べてみましたが、難しそうだったので今回はパスしようかと。。。

    最終的には、強制削除にするか強制非公開にするかは、条件によって分岐したほうが良いなと考えています。(よほど悪質でない限り、強制非公開にとどめる等)

    今回も皆さまのアドバイスをどうも有り難うございました。
    本当に助かりました!
    今後とも宜しくお願い致します。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「特定の条件下で、投稿/ページの保存を無効にする方法」には新たに返信することはできません。