Créer un simple CRM dans WordPress Extension de la recherche WordPress

Nous avons cherché à créer un système CRM simple dans WordPress. Dans la dernière partie de cette série, nous avons ajouté du code à notre plug-in, ce qui nous a permis d'afficher nos champs personnalisés avancés dans la table des listes WordPress (WP_List_Table) et de trier nos données alphabétiquement par ces nouveaux champs..

Aujourd'hui, nous verrons comment étendre la fonctionnalité de recherche pour inclure les données stockées dans nos champs personnalisés..

Fonction de recherche

Chaque type de poste ayant une interface d'administration est livré avec un champ de recherche:

Par défaut, lorsqu'un utilisateur recherche un ou plusieurs messages dans l'interface d'administration de WordPress, WordPress effectue une recherche dans wp_posts table pour trouver des correspondances partielles dans les champs suivants:

  • Titre
  • Contenu
  • Extrait

Si nous essayons de rechercher un numéro de téléphone partiel, nous verrons qu'aucun résultat ne s'affiche:

Pour notre type de message personnalisé, cela n’est pas très utile si nous voulons trouver un contact par numéro de téléphone ou adresse électronique.!

Advanced Custom Fields stocke ses données dans la wp_postmeta table, que WordPress ne recherche pas par défaut. Nous devons utiliser deux des WordPress fournis filtres permettre à la fonctionnalité de recherche de WordPress d'effectuer également une recherche dans les données de champs personnalisés avancés. Ces filtres vont:

  1. effectuer une jointure SQL entre la table WordPress Post Meta et la table WordPress Posts
  2. ajouter une clause SQL WHERE à la requête de publication WordPress pour effectuer une recherche dans notre table Meta de publications WordPress

Effectuer un SQL JOIN

Commençons par ajouter le posts_join filtrer à la construction de notre classe de plugin pour rejoindre le WordPress:

/ ** * Constructeur. Appelé quand le plugin est initialisé * / function __construct () add_action ('init', array (& $ this, 'register_custom_post_type')); add_action ('plugins_loaded', tableau (& $ this, 'acf_fields')); add_filter ('manage_edit-contact_columns', tableau (& $ this, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', tableau (& $ this, 'output_table_columns_data'), 10, 2); add_filter ('manage_edit-contact_sortable_columns', tableau (& $ this, 'define_sortable_table_columns')); if (is_admin ()) add_filter ('request', tableau (& $ this, 'orderby_sortable_table_columns')); add_filter ('posts_join', tableau (& $ this, 'search_meta_data_join'));  

Nous devons également définir notre search_meta_data_join () fonction, qui indique à WordPress quelle table nous voulons joindre à la table principale des messages WordPress:

/ ** * Ajoute une jointure à la méta-table WordPress pour les recherches de clé de licence dans l'administration WordPress * * @param chaîne $ join instruction SQL JOIN * * chaîne de retour instruction SQL JOIN * / function search_meta_data_join ($ join) global $ wpdb; // Rejoignez la table meta seulement si nous effectuons une recherche if (empty (get_query_var ('s')))) return $ join;  // Rejoignez la méta-table post uniquement si nous sommes dans le type de publication personnalisé des contacts if ('contact'! = Get_query_var ('post_type')) return $ join;  // Rejoignez la table meta table $ join. = "LEFT JOIN $ wpdb-> postmeta ON $ wpdb-> posts.ID = $ wpdb-> postmeta.post_id"; return $ join;  

get_query_var () est une fonction qui renvoie la variable de requête appropriée stockée dans le WP_Query classe. WP_Query est une classe WordPress qui fournit:

… Des informations définissant la requête en cours… de quel type de requête il s'agit (éventuellement une archive de catégorie, une archive datée, un flux ou une recherche) et récupère les publications demandées. Il conserve de nombreuses informations sur la demande, qui peuvent être extraites ultérieurement..

get_query_var () est la magie qui nous permet de «tirer» cette information. Dans ce cas, nous vérifions la variable de requête 's', nous dire quel terme de recherche (le cas échéant) l'utilisateur a demandé. Nous utilisons également cette même fonction pour vérifier le ou les types de publication demandés par l'utilisateur. Nous souhaitons uniquement élargir notre recherche si l'utilisateur consulte le type de publication personnalisée du contact..

Si ces conditions sont remplies, nous rejoignons le wp_postmeta table à la principale wp_posts table.

$ wpdb est également utilisé ici, et c'est une classe définie qui:

… Contient un ensemble de fonctions permettant d’interagir avec une base de données. Son objectif principal est de fournir une interface avec la base de données WordPress, mais peut être utilisé pour communiquer avec toute autre base de données appropriée..

En bref, $ wpdb nous permet d'accéder à la base de données MySQL, d'obtenir les paramètres de configuration et d'effectuer des requêtes SQL.

Dans ce cas, nous utilisons $ wpdb pour obtenir les noms des tables Post et Meta, car celles-ci peuvent être modifiées à chaque installation WordPress. Par exemple, une installation peut définir son préfixe de nom de table sur wp_ (qui est la valeur par défaut), alors qu’une autre installation peut le configurer my_awesome_site_. Nous ne pouvons pas coder en dur les noms de table, car nous ne pouvons garantir qu'ils seront toujours wp_posts et wp_postmeta, donc nous utilisons $ wpdb-> posts et $ wpdb-> postmeta, qui contiennent les noms de table spécifiques à cette installation WordPress.

Ajout à la clause WHERE SQL

Une fois notre SQL JOIN terminé, nous devons maintenant demander à WordPress de rechercher dans la table Post Meta jointe..

Retournez au plugin __construction(), et ajouter une nouvelle fonction à la posts_where filtre:

/ ** * Constructeur. Appelé quand le plugin est initialisé * / function __construct () add_action ('init', array (& $ this, 'register_custom_post_type')); add_action ('plugins_loaded', tableau (& $ this, 'acf_fields')); add_filter ('manage_edit-contact_columns', tableau (& $ this, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', tableau (& $ this, 'output_table_columns_data'), 10, 2); add_filter ('manage_edit-contact_sortable_columns', tableau (& $ this, 'define_sortable_table_columns')); if (is_admin ()) add_filter ('request', tableau (& $ this, 'orderby_sortable_table_columns')); add_filter ('posts_join', tableau (& $ this, 'search_meta_data_join')); add_filter ('posts_where', tableau (& $ this, 'search_meta_data_where'));  

Nous devons également définir notre search_meta_data_where () fonction, qui indique à WordPress de rechercher dans nos méta-données de publication:

/ ** * Ajoute une clause where à la table meta de WordPress pour les recherches de clé de licence dans l'administration WordPress * * @param string $ where clause (s) WHERE SQL * @return string clauses WHERE SQL * / function search_meta_data_where ($ where)  $ wpdb global; // Rejoignez la table meta seulement si nous effectuons une recherche if (empty (get_query_var ('s')))) return $ where;  // Rejoignez la table meta seulement si nous sommes dans le type de publication personnalisé des contacts if ('contact'! = Get_query_var ('post_type')) return $ where;  // Récupère le début de la requête, qui est 'AND ((', et le reste de la requête $ startOfQuery = substr ($ where, 0, 7); $ restOfQuery = substr ($ where, 7); // Injectez notre clause WHERE entre le début de la requête et le reste de la requête $ where = $ startOfQuery. "(". $ Wpdb-> postmeta. ".Meta_value LIKE '%". Get_query_var (' s '). "% 'OU ". $ RestOfQuery." GROUP BY ". $ Wpdb-> posts." .Id "; // Renvoie la clause WHERE révisée, retourne $ où; 

De la même manière que nous avons fait dans search_meta_data_join (), nous vérifions à nouveau que la requête WordPress est une recherche sur le type de message personnalisé des contacts. Si ce n'est pas le cas, nous retournons le $ tant que clause sans modification.

Si nous devons modifier le $ tant que clause, nous le faisons en:

  • obtenir le début de la clause WHERE: ' ET(('
  • obtenir le reste de la clause WHERE
  • injecter notre clause WHERE pour rechercher dans la table Post Meta meta_value colonne pour toute instance de notre terme de recherche
  • ajouter une condition OR à la fin de notre clause WHERE, en y ajoutant le reste de la requête
  • regrouper les résultats par l'ID de poste

Nous devons regrouper les résultats car il y aura généralement plus d'une entrée dans la table Post Meta pour un ID de post donné. Parce que nous avons créé un JOIN entre les postes et leur poste Meta, si nous ne groupions pas les résultats, nous aurions le même message répété dans notre tableau..

Pour vérifier que nos clauses JOIN et WHERE ont fonctionné, rechargez votre table de contacts et essayez de rechercher l'un de vos contacts à l'aide d'une partie de leur numéro de téléphone:

Si cela fonctionne, félicitations! Vous pouvez maintenant effectuer une recherche dans les champs personnalisés avancés spécifiés dans votre système CRM..

Suivant…

Dans le prochain article, nous allons restreindre et masquer les fonctionnalités d'administration de WordPress et les éléments de menu dont nous n'avons pas besoin pour notre CRM..