{"id":287571,"date":"2026-03-17T16:47:06","date_gmt":"2026-03-17T16:47:06","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ldap-staff-directory\/"},"modified":"2026-03-17T17:12:05","modified_gmt":"2026-03-17T17:12:05","slug":"ldap-staff-directory","status":"publish","type":"plugin","link":"https:\/\/szl.wordpress.org\/plugins\/ldap-staff-directory\/","author":23300469,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.6","stable_tag":"1.0.6","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"LDAP Staff Directory","header_author":"Carlos Mairena","header_description":"Connects to LDAPS to display an employee directory from an OU. Supports Elementor, Beaver Builder and a native shortcode.","assets_banners_color":"","last_updated":"2026-03-17 17:12:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/ldap-staff-directory\/","header_author_uri":"https:\/\/carlosmmairena.com","rating":5,"author_block_rating":0,"active_installs":0,"downloads":177,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.6":{"tag":"1.0.6","author":"carlosmmairena","date":"2026-03-17 17:12:05"}},"upgrade_notice":{"1.0.6":"<p>The custom CSS textarea in the admin panel and the Beaver Builder Advanced tab have been removed. To style the directory, use CSS custom properties (<code>--ldap-primary-color<\/code>, <code>--ldap-card-bg<\/code>, <code>--ldap-columns<\/code>, etc.) in your theme&#039;s stylesheet instead.<\/p>","1.0.0":"<p>Initial release \u2014 no upgrade steps required.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3485004,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3485004,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.6"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Admin settings page \u2014 connection and display options","2":"Employee directory rendered with the default style","3":"Elementor widget controls","4":"Beaver Builder module tabs"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2466,76538,2464,11420,257979],"plugin_category":[],"plugin_contributors":[257980],"plugin_business_model":[],"class_list":["post-287571","plugin","type-plugin","status-publish","hentry","plugin_tags-directory","plugin_tags-elementor","plugin_tags-ldap","plugin_tags-staff","plugin_tags-wpbeaverbuilder","plugin_contributors-carlosmmairena","plugin_committers-carlosmmairena"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ldap-staff-directory\/assets\/icon-128x128.png?rev=3485004","icon_2x":"https:\/\/ps.w.org\/ldap-staff-directory\/assets\/icon-256x256.png?rev=3485004","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>LDAP Staff Directory<\/strong> lets you connect your WordPress site to an LDAP \/ LDAPS server and publish a public employee directory with zero manual data entry.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Connects to any LDAP or LDAPS server (including Active Directory, OpenLDAP, Samba)<\/li>\n<li>Configurable Base OU and Bind DN<\/li>\n<li>Extracts: full name, email, job title, department<\/li>\n<li>Shortcode <code>[ldap_directory]<\/code> usable in any post, page or widget<\/li>\n<li>Native Elementor widget with full style controls<\/li>\n<li>Native Beaver Builder module with General and Style tabs<\/li>\n<li>Real-time client-side search (no page reload)<\/li>\n<li>Client-side pagination with configurable items per page<\/li>\n<li>Transient-based cache with configurable TTL and one-click invalidation<\/li>\n<li>Admin panel under <strong>Settings \u2192 LDAP Directory<\/strong><\/li>\n<li>SSL certificate verification toggle (supports self-signed certs)<\/li>\n<li>Optional CA certificate file path<\/li>\n<li>Multisite compatible (per-site settings)<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>PHP <code>ldap<\/code> extension enabled on the server<\/li>\n<li>WordPress 5.8 or higher<\/li>\n<li>PHP 7.4 or higher<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>ldap-staff-directory<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through <strong>Plugins \u2192 Installed Plugins<\/strong>.<\/li>\n<li>Go to <strong>Settings \u2192 LDAP Directory<\/strong> and fill in your LDAP connection details.<\/li>\n<li>Click <strong>Test Connection<\/strong> to verify the settings.<\/li>\n<li>Insert <code>[ldap_directory]<\/code> in any post or page, or use the Elementor \/ Beaver Builder widget.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"the%20plugin%20says%20%22php%20ldap%20extension%20not%20found%22.%20what%20should%20i%20do%3F\"><h3>The plugin says \"PHP LDAP extension not found\". What should I do?<\/h3><\/dt>\n<dd><p>Contact your hosting provider and ask them to enable the <code>php-ldap<\/code> (or <code>php7.x-ldap<\/code>) extension. On Linux servers you can typically install it with:\n    sudo apt-get install php-ldap or <code>sudo yum install php-ldap<\/code>.<\/p><\/dd>\n<dt id=\"my%20server%20uses%20a%20self-signed%20ssl%20certificate.%20how%20do%20i%20connect%3F\"><h3>My server uses a self-signed SSL certificate. How do I connect?<\/h3><\/dt>\n<dd><p>Go to <strong>Settings \u2192 LDAP Directory \u2192 LDAP Connection<\/strong> and uncheck <strong>Verify SSL Certificate<\/strong>. Save, then click <strong>Test Connection<\/strong>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20connect%20to%20active%20directory%3F\"><h3>How do I connect to Active Directory?<\/h3><\/dt>\n<dd><p>Use <code>ldaps:\/\/your-dc.domain.com<\/code> as the server, port <code>636<\/code>, and a service account DN such as <code>CN=svc-wordpress,OU=ServiceAccounts,DC=domain,DC=com<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20show%20only%20certain%20fields%3F\"><h3>Can I show only certain fields?<\/h3><\/dt>\n<dd><p>Yes. In the admin panel, check or uncheck the fields you want. You can also override per shortcode:\n    [ldap_directory fields=\"name,title\"]<\/p><\/dd>\n<dt id=\"how%20long%20is%20data%20cached%3F\"><h3>How long is data cached?<\/h3><\/dt>\n<dd><p>By default 60 minutes. Change the TTL under <strong>Settings \u2192 LDAP Directory \u2192 Cache<\/strong> or flush immediately with the <strong>Clear Cache<\/strong> button.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fix: Removed custom CSS input feature (admin panel textarea and Beaver Builder Advanced tab) per WordPress.org guideline prohibiting arbitrary CSS\/JS\/PHP injection.<\/li>\n<li>Fix: Added <code>phpcs:ignore<\/code> annotation with justification to <code>echo do_shortcode()<\/code> output in Beaver Builder frontend template; changed <code>per_page<\/code> shortcode argument from <code>esc_attr()<\/code> to <code>absint()<\/code> for correct integer escaping.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Fix: Replace inline <code>&lt;style&gt;<\/code> tags in Elementor widget and Beaver Builder module with <code>wp_add_inline_style()<\/code> and Elementor's native <code>add_render_attribute()<\/code> API to comply with WordPress.org plugin guidelines (Guideline 11 \/ wp_enqueue best practices).<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Security: LDAP bind password is now encrypted at rest using libsodium (XSalsa20-Poly1305). The encryption key is derived from WordPress's built-in security keys \u2014 no configuration required.<\/li>\n<li>Security: Existing plaintext passwords continue to work and are automatically re-encrypted on the next settings save (transparent migration).<\/li>\n<li>Security: An admin notice is shown when WordPress security keys (wp-config.php) have been regenerated, prompting the administrator to re-enter the bind password.<\/li>\n<li>Note: Regenerating WordPress security keys requires re-entering the bind password once in Settings \u2192 LDAP Staff Directory.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix: Plugin now activates without the PHP LDAP extension; a persistent admin notice informs the administrator when the extension is missing instead of blocking activation with a fatal error.<\/li>\n<li>Fix: <code>\/* translators: *\/<\/code> comment repositioned inside <code>sprintf()<\/code>, immediately above <code>__()<\/code>, to satisfy the WordPress Plugin Checker i18n rule.<\/li>\n<li>Fix: All local variables in included template files (<code>directory.php<\/code>, <code>beaver-builder\/frontend.php<\/code>) renamed with <code>ldap_ed_<\/code> prefix to comply with WPCS global-variable naming requirements.<\/li>\n<li>Fix: <code>absint()<\/code> applied to <code>$columns<\/code> in Elementor widget <code>printf()<\/code> output to satisfy the WPCS escaping rule for integer values.<\/li>\n<li>Fix: <code>load_plugin_textdomain()<\/code> removed \u2014 not required for WordPress.org-hosted plugins since WordPress 4.6.<\/li>\n<li>Fix: <code>Domain Path<\/code> header removed from plugin file \u2014 no local translation files are bundled.<\/li>\n<li>Chore: \"Tested up to\" updated to WordPress 6.9.<\/li>\n<li>Chore: Tag list reduced to five entries per WordPress.org limit.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Feat: Added <code>telephoneNumber<\/code> field \u2014 read from LDAP, displayed on cards as a clickable <code>tel:<\/code> link, included in client-side search, and available in admin panel, Elementor and Beaver Builder controls.<\/li>\n<li>Feat: New \"Exclude Disabled Accounts\" setting (connection section) \u2014 filters out disabled Active Directory accounts using the <code>userAccountControl<\/code> bit flag. Leave unchecked for OpenLDAP\/other servers.<\/li>\n<li>Feat: Resilient cache \u2014 when the LDAP server is unreachable after cache expiry, the last successfully fetched data (stale copy) is served silently to visitors. Only a manual \"Clear Cache\" action removes the stale copy entirely.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: LDAP server URL no longer lost on save \u2014 replaced <code>esc_url_raw()<\/code> (which strips <code>ldap:\/\/<\/code>\/<code>ldaps:\/\/<\/code> schemes) with a dedicated sanitizer that validates the scheme and shows an admin error on invalid input.<\/li>\n<li>Fix: Added runtime admin notice when the PHP LDAP extension is missing, covering cases where the extension is disabled after activation or the plugin is activated via WP-CLI\/DB without going through the activation hook.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Connects to an LDAPS server and displays an employee directory from a specific OU. Supports Elementor, Beaver Builder and a native shortcode.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/287571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=287571"}],"author":[{"embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/carlosmmairena"}],"wp:attachment":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=287571"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=287571"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=287571"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=287571"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=287571"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=287571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}