web-dev-qa-db-ja.com

ページがユーザーを保持している場合はそのページを削除しないでください

私は何かをしなければなりません、しかし私はそれをする方法を思い付くことができません。

一方で、私は会社であるページを作成しました。つまり、すべてのページは会社ページです。
一方、自分のプロファイルに自分が所属する会社の名前を保持するカスタムフィールドを追加したユーザーを作成しました。

いいえ、これは単にこれら2つの間の関係です。そのため、会社を削除した場合はユーザーを削除するか、少なくとも会社に接続しているユーザーがまだいるために会社を削除できないことを示すメッセージを表示する必要があります。

ページ削除ボタンにアクションを追加するには、何らかの機能をフックする必要があると思います。

ユーザーを削除してWPがユーザーの投稿を別のユーザーに割り当てているかどうかを尋ねるのとほぼ同じです。

誰かがこれについて私にもっと話したり、いくつかの考えやアイデアを共有することはできますか?

==================================
更新
そこで私はbefore_delete_postをフックするcustom_functionのために以下を作成しました
注:これは出力を目的として会社のページでテストされています。名前はURLで渡されるため、私は$_GET["company"]リクエストを使用します。

global $post;
$company = $_GET['company'];
$employees = $wpdb->get_results("
             SELECT meta_value 
             FROM $wpdb->usermeta 
             WHERE meta_key = 'company' 
             AND meta_value='$company'"
             );

/* 
output $employees: 
[0] => stdClass Object
    (
        [meta_value] => company_name
    )
*/

if(in_array($company, $employees)){
    echo 'Yes';
}else{
    echo 'No';
}

company_nameページを削除したいとしましょう。この名前がusermetaテーブルにあるかどうか確認します。これが本当ならば、削除機能は実行されるべきではありません。そうでなければページを削除することができます。

しかし、これは単に_ Noをエコーし​​続ける一方で、_ Yesをエコーするはずですが、私はページ名がcompany_nameであり、それが従業員リストにあることを知っているので。だから私は試合があるはずです。

1
Interactive

それはオブジェクトで配列を与えます。それでin_array()は何も見つけません、あなたは前にそれを変換しなければなりません。 wbdbから結果が得られたら:

$employees_array = array();
foreach($employees as $employee) {
    $employees_array[] = $employee->meta_value;
}

if(in_array($company, $employees_array)) {
    ...
}
1
Iamzozo

これは、データベーススキーマに制約を追加することで最もよく解決できます。これを達成するための最善の方法は、 "DELETE"アクションに反応する外部キー制約を追加することです。外部キーの詳細については、 http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html をお読みください。

また、DELETEアクションを呼び出す前にSELECTを実行することもできます。それが返されると、ユーザーは何らかのエラーを出して関数を終了します。

0
Arjan Kuiken