web-dev-qa-db-ja.com

フロントページの削除やゴミ箱への移動を防ぐ

これを使って自分のフロントページが削除されたりゴミ箱に移動されたりするのを防ぎたいのですが。

add_action( 'wp_trash_post',      'tcb_page_delete_check' );
add_action( 'before_delete_post', 'tcb_page_delete_check' );
function tcb_page_delete_check( $post_id ){
    $frontpage = get_option( 'page_on_front');
    $blogpage = get_option('page_for_posts'); 
      if( $post_id === $frontpage || $post_id === $blogpage ) {
        wp_redirect(admin_url('edit.php?post_type=page'));
        exit;
      }
}

問題は、「ゴミ箱」をクリックするとoption( 'page_on_front')のIDが7(私の希望するフロントページID)から0に変更されるため、フロントページIDと一致せず、自分のページがゴミ箱に移動されることです。

そして、私がそれを変えるなら:

    if( $post_id === 7 ...

ページはゴミ箱に移動されませんが、オプション( 'page_on_front')のIDは0に変更されます。

フロントページが同じままでゴミ箱に捨てられないようにするために、オプション( 'page_on_front')を0に変更しないようにするにはどうすればよいですか。

2
Edd Clark

コードスニペットには2つの問題があります。

1)比較

最初の問題はこの行にあります:

  if( $post_id === $frontpage || $post_id === $blogpage ) {

intstringを厳密に比較しているところです。

両方の変数が同じで、同じを持つ場合のみ、===比較はTRUEを返すことに注意してください。

代わりにこれを試してください:

  if( $post_id == $frontpage || $post_id == $blogpage ) {

==は型変換を実行するか、単に(int)型キャストを使用します。

  if( $post_id === (int) $frontpage || $post_id === (int) $blogpage ) {

intval() を使うこともできます。

2)優先度

2番目の問題は、コールバック優先順位です。たとえば、デフォルトの1ではなく優先順位10を付けて、コールバックを先に実行する必要があります。

add_action( 'wp_trash_post',      'tcb_page_delete_check', 1 );
add_action( 'before_delete_post', 'tcb_page_delete_check', 1 );

お役に立てれば。

1
birgire