plugin = $plugin; } /** Register enabled utilities. */ public function register() { if ( $this->plugin->is_power_enabled( 'current_user_shortcodes' ) ) { add_shortcode( 'divi_powers_user', array( $this, 'current_user_shortcode' ) ); $this->register_legacy_user_shortcodes(); } if ( $this->plugin->is_power_enabled( 'admin_bar_links' ) ) { add_action( 'admin_bar_menu', array( $this, 'admin_bar_links' ), 80 ); add_filter( 'post_row_actions', array( $this, 'visual_builder_row_action' ), 15, 2 ); add_filter( 'page_row_actions', array( $this, 'visual_builder_row_action' ), 15, 2 ); } } /** * Render a safe value from the currently signed-in WordPress user. * * Usage: [divi_powers_user field="first_name" fallback="Guest"] */ public function current_user_shortcode( $atts ) { $atts = shortcode_atts( array( 'field' => 'display_name', 'fallback' => '', 'size' => 50, 'class' => '', 'style' => '', 'alt' => '', ), $atts, 'divi_powers_user' ); if ( ! is_user_logged_in() ) { return esc_html( $atts['fallback'] ); } $user = wp_get_current_user(); $field = sanitize_key( $atts['field'] ); $map = array( 'display_name' => $user->display_name, 'first_name' => $user->first_name, 'last_name' => $user->last_name, 'username' => $user->user_login, 'email' => $user->user_email, 'id' => $user->ID, ); if ( 'avatar' === $field ) { $size = min( 512, max( 16, absint( $atts['size'] ) ) ); $classes = array_filter( array_map( 'sanitize_html_class', preg_split( '/\s+/', (string) $atts['class'] ) ) ); $class_attr = $classes ? ' ' . implode( ' ', $classes ) : ''; $style_attr = safecss_filter_attr( (string) $atts['style'] ); $avatar = get_avatar( $user->ID, $size, 'mystery', sanitize_text_field( $atts['alt'] ) ); $allowed = array( 'span' => array( 'class' => true, 'style' => true ), 'img' => array( 'alt' => true, 'class' => true, 'decoding' => true, 'height' => true, 'loading' => true, 'sizes' => true, 'src' => true, 'srcset' => true, 'width' => true, ), ); $html_safe = '' . wp_kses( $avatar, array( 'img' => $allowed['img'] ) ) . ''; return wp_kses( $html_safe, $allowed ); } if ( ! array_key_exists( $field, $map ) ) { return esc_html( $atts['fallback'] ); } return esc_html( (string) $map[ $field ] ); } /** Preserve the familiar Divi Hacks shortcode names for existing layouts. */ private function register_legacy_user_shortcodes() { $aliases = array( 'user-display-name' => 'display_name', 'user-first-name' => 'first_name', 'user-last-name' => 'last_name', 'user-username' => 'username', 'user-email' => 'email', 'user-avatar' => 'avatar', ); foreach ( $aliases as $tag => $field ) { if ( shortcode_exists( $tag ) ) { continue; } add_shortcode( $tag, function ( $atts ) use ( $field ) { $atts = is_array( $atts ) ? $atts : array(); $atts['field'] = $field; return wp_kses_post( $this->current_user_shortcode( $atts ) ); } ); } } /** Add one compact, capability-aware toolbar menu instead of altering Appearance. */ public function admin_bar_links( $admin_bar ) { if ( ! is_user_logged_in() || ! $admin_bar instanceof WP_Admin_Bar || ! current_user_can( 'edit_posts' ) ) { return; } $admin_bar->add_node( array( 'id' => 'divi-powers-quick-links', 'title' => __( '5D Powers for Divi', '5d-powers-for-divi' ), 'href' => admin_url( 'admin.php?page=divi-powers' ), ) ); $post_id = get_queried_object_id(); if ( $post_id && current_user_can( 'edit_post', $post_id ) ) { $this->add_admin_bar_node( $admin_bar, 'divi-powers-edit', __( 'Edit in WordPress', '5d-powers-for-divi' ), get_edit_post_link( $post_id, 'raw' ) ); $this->add_admin_bar_node( $admin_bar, 'divi-powers-visual-builder', __( 'Edit with Divi', '5d-powers-for-divi' ), add_query_arg( 'et_fb', '1', get_permalink( $post_id ) ) ); $this->add_admin_bar_node( $admin_bar, 'divi-powers-duplicate', __( 'Duplicate this content', '5d-powers-for-divi' ), $this->duplicate_url( $post_id ) ); } $this->add_admin_bar_node( $admin_bar, 'divi-powers-pages', __( 'Pages', '5d-powers-for-divi' ), admin_url( 'edit.php?post_type=page' ) ); $this->add_admin_bar_node( $admin_bar, 'divi-powers-posts', __( 'Posts', '5d-powers-for-divi' ), admin_url( 'edit.php' ) ); $this->add_admin_bar_node( $admin_bar, 'divi-powers-media', __( 'Media Library', '5d-powers-for-divi' ), admin_url( 'upload.php' ) ); if ( current_user_can( 'manage_options' ) ) { $this->add_admin_bar_node( $admin_bar, 'divi-powers-theme-options', __( 'Divi Theme Options', '5d-powers-for-divi' ), admin_url( 'admin.php?page=et_divi_options' ) ); $this->add_admin_bar_node( $admin_bar, 'divi-powers-theme-builder', __( 'Divi Theme Builder', '5d-powers-for-divi' ), admin_url( 'admin.php?page=et_theme_builder' ) ); $this->add_admin_bar_node( $admin_bar, 'divi-powers-library', __( 'Divi Library', '5d-powers-for-divi' ), admin_url( 'edit.php?post_type=et_pb_layout' ) ); $this->add_admin_bar_node( $admin_bar, 'divi-powers-settings', __( '5D Powers for Divi Settings', '5d-powers-for-divi' ), admin_url( 'admin.php?page=divi-powers' ) ); } } /** Add an Edit with Divi action to editable public content lists. */ public function visual_builder_row_action( $actions, $post ) { if ( ! $post instanceof WP_Post || ! current_user_can( 'edit_post', $post->ID ) || ! $this->is_supported_post_type( $post->post_type ) ) { return $actions; } $actions['divi_powers_visual_builder'] = '' . esc_html__( 'Edit with Divi', '5d-powers-for-divi' ) . ''; return $actions; } private function add_admin_bar_node( $admin_bar, $id, $title, $url ) { if ( ! $url ) { return; } $admin_bar->add_node( array( 'parent' => 'divi-powers-quick-links', 'id' => $id, 'title' => $title, 'href' => $url, ) ); } private function duplicate_url( $post_id ) { if ( ! $this->plugin->is_power_enabled( 'duplicate_content' ) ) { return ''; } return wp_nonce_url( admin_url( 'admin-post.php?action=divi_powers_duplicate_content&post=' . absint( $post_id ) ), 'divi_powers_duplicate_content_' . absint( $post_id ) ); } private function is_supported_post_type( $post_type ) { $object = get_post_type_object( $post_type ); return $object && ! empty( $object->public ) && ! in_array( $post_type, array( 'attachment', 'revision', 'nav_menu_item' ), true ); } }