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