true ), 'objects' );
$result = array();
foreach ( $types as $type ) {
// `attachment` is public but participates in the graph as media
// (rendered in the side panel) rather than as a node — skip it
// on the node-type axis to avoid every image becoming a node.
if ( 'attachment' === $type->name ) {
continue;
}
$result[] = array(
'slug' => (string) $type->name,
'label' => (string) $type->labels->name,
'icon' => (string) ( ! empty( $type->menu_icon ) ? $type->menu_icon : 'dashicons-admin-post' ),
);
}
/**
* Filter the list of post types shown in the Content Graph filter
* bar. Each entry must declare `slug`, `label`, and `icon`. Removing
* an entry hides it from the filter bar AND excludes it from the
* graph entirely.
*
* @since 0.8.2
*
* @param array[] $result Default: every public post type except attachment.
*/
$filtered = apply_filters( 'desktop_mode_content_graph_post_types', $result );
return is_array( $filtered ) ? array_values( $filtered ) : $result;
}
/**
* Render the Content Graph window's static template body. The bundle
* mounts its UI into `[data-desktop-mode-content-graph-root]`.
*
* @since 0.8.2
*/
function desktop_mode_content_graph_render_template() {
ob_start();
?>
__( 'Content Graph', 'desktop-mode' ),
'icon' => 'dashicons-networking',
'template' => 'desktop_mode_content_graph_render_template',
'script' => 'desktop-mode-content-graph',
'style' => 'desktop-mode-content-graph',
'width' => 1080,
'height' => 720,
'min_width' => 720,
'min_height' => 480,
'placement' => 'none',
'config' => array(
'restRoot' => esc_url_raw( rest_url() ),
'restNonce' => wp_create_nonce( 'wp_rest' ),
'apiBase' => esc_url_raw( rest_url( 'desktop-mode/v1/content-graph' ) ),
'editPostUrl' => esc_url_raw( admin_url( 'post.php' ) ),
'editTermUrl' => esc_url_raw( admin_url( 'term.php' ) ),
'editUserUrl' => esc_url_raw( admin_url( 'user-edit.php' ) ),
'editCommentUrl' => esc_url_raw( admin_url( 'comment.php' ) ),
'mediaUrl' => esc_url_raw( admin_url( 'upload.php' ) ),
'postTypes' => desktop_mode_content_graph_post_types(),
),
);
/**
* Filter the args used to register the Content Graph native window.
*
* @since 0.8.2
*
* @param array $window_args Args passed to `desktop_mode_register_window()`.
*/
$window_args = (array) apply_filters( 'desktop_mode_content_graph_window_args', $window_args );
$registered = desktop_mode_register_window( 'desktop-mode-content-graph', $window_args );
if ( is_wp_error( $registered ) ) {
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
error_log( '[desktop-mode] Content Graph window registration failed: ' . $registered->get_error_message() );
return;
}
$icon_args = array(
'title' => __( 'Content Graph', 'desktop-mode' ),
'icon' => 'dashicons-networking',
'window' => 'desktop-mode-content-graph',
'pinned' => false,
'position' => 20,
);
/**
* Filter the args used to register the Content Graph desktop icon.
*
* @since 0.8.2
*
* @param array $icon_args Args passed to `desktop_mode_register_icon()`.
*/
$icon_args = (array) apply_filters( 'desktop_mode_content_graph_icon_args', $icon_args );
desktop_mode_register_icon( 'desktop-mode-content-graph', $icon_args );
}
add_action( 'init', 'desktop_mode_content_graph_register_window', 20 );
/**
* Enqueue the bundle's CSS in admin context. The script is lazy-
* loaded by the native-window sync.
*
* @since 0.8.2
*/
function desktop_mode_content_graph_enqueue_styles() {
if ( ! desktop_mode_content_graph_user_can_use() ) {
return;
}
wp_enqueue_style( 'desktop-mode-content-graph' );
}
add_action( 'admin_enqueue_scripts', 'desktop_mode_content_graph_enqueue_styles', 30 );