web-dev-qa-db-fra.com

Ne supprimez pas une page si elle contient des utilisateurs

Je dois faire quelque chose mais je ne peux tout simplement pas trouver un moyen de le faire.

D'une part, j'ai créé des pages qui sont des entreprises. Donc, chaque page est une page de société.
D'autre part, j'ai créé des utilisateurs qui ont ajouté à leur profil un champ personnalisé contenant le nom de la société pour laquelle ils travaillent.

Non, il s'agit simplement d'un lien entre ces deux. Je suis donc parvenu à la conclusion que si une entreprise est supprimée, les utilisateurs doivent l'être ou au moins un message doit s'afficher pour lui indiquer que l'entreprise ne peut pas être supprimée car il existe encore des utilisateurs connectés à l'entreprise.

Je pense que je devrais utiliser une sorte de fonction pour ajouter une action au bouton de suppression de page.

C'est presque comme si vous supprimiez un utilisateur et que WP vous demande si les publications de l'utilisateur ont été attribuées à un autre utilisateur.

Quelqu'un peut-il m'en dire plus ou partager des réflexions/idées?

===================================
METTRE À JOUR
J'ai donc créé ce qui suit pour une fonction personnalisée à connecter au before_delete_post
REMARQUE: ceci est testé sur une page de société à des fins de sortie. J'utilise une requête $_GET["company"] car le nom est transmis dans l'URL.

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';
}

Disons que je veux supprimer la page company_name. Ce que je fais est de voir si ce nom est dans la table usermeta. Si cela est vrai, la fonction de suppression ne doit pas être exécutée. Sinon, la page peut être supprimée.

Mais cela continue à faire écho à No alors qu'il devrait faire écho à Yes car je sais que le nom de la page est company_name et qu'il est dans la liste des employés. Donc je devrais avoir un match.

1
Interactive

Il donne un tableau avec des objets. Donc, in_array() ne trouvera rien, vous devez le convertir avant. Après avoir obtenu les résultats de wbdb:

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

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

ceci peut être mieux résolu en ajoutant des contraintes dans vos schémas de base de données. Le meilleur moyen d'y parvenir consiste à ajouter une contrainte de clé étrangère qui réagit à l'action "DELETE". Pour plus d’informations sur la clé étrangère, lisez: http://dev.mysql.com/doc/refman/5.6/fr/create-table-foreign-keys.html

Vous pouvez également faire un SELECT avant d'appeler l'action DELETE et si elle retourne, les utilisateurs quittent la fonction avec une erreur quelconque.

0
Arjan Kuiken