social-navigation.php 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. // We should only change the render of the navigtion block
  3. // to social links in the following conditions.
  4. function blockbase_condition_to_render_social_menu( $block_content, $block ) {
  5. // The block should be a navigation block.
  6. if ( 'core/navigation' !== $block['blockName'] ) {
  7. return false;
  8. }
  9. // The theme should have a menu defined at the social location.
  10. if ( ! has_nav_menu( 'social' ) ) {
  11. return false;
  12. }
  13. // The block should have a social links attribute.
  14. if ( empty( $block['attrs']['__unstableSocialLinks'] ) ) {
  15. return false;
  16. }
  17. return true;
  18. }
  19. function get_social_menu_as_social_links_block( $block ) {
  20. if ( empty( $block['attrs']['__unstableSocialLinks'] ) ) {
  21. return false;
  22. }
  23. $social_links_location = $block['attrs']['__unstableSocialLinks'];
  24. $nav_menu_locations = get_nav_menu_locations();
  25. $social_menu_id = $nav_menu_locations[ $social_links_location ];
  26. $class_name = 'is-style-logos-only';
  27. if( ! empty( $block['attrs']['itemsJustification'] ) ) {
  28. $class_name .= ' items-justified-' . $block['attrs']['itemsJustification'];
  29. }
  30. // Get color for social icons.
  31. $theme_data = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data()->get_raw_data();
  32. $social_links_icon_color_value = "var(--wp--custom--color--primary)";
  33. $social_links_icon_color = 'primary';
  34. if ( array_key_exists( 'settings', $theme_data ) && array_key_exists( 'custom', $theme_data['settings'] ) && array_key_exists( 'navigation/social-links', $theme_data['settings']['custom'] ) && array_key_exists( 'color', $theme_data['settings']['custom']['navigation/social-links'] ) && array_key_exists( 'text', $theme_data['settings']['custom']['navigation/social-links']['color'] ) ) {
  35. $social_links_icon_color_value = $theme_data['settings']['custom']['navigation/social-links']['color']['text'];
  36. $social_links_icon_color = preg_replace( '/var\(--wp--custom--color--(.+)\)/', '$0 --> $2 $1', $social_links_icon_color_value );
  37. }
  38. $social_links_content = '<!-- wp:social-links {"iconColor":"' . $social_links_icon_color . '","iconColorValue":"' . $social_links_icon_color_value . '","className":"' . $class_name . '"} --><ul class="wp-block-social-links has-icon-color ' . $class_name . '">';
  39. $menu = wp_get_nav_menu_items( $social_menu_id );
  40. foreach ($menu as $menu_item) {
  41. $service_name = preg_replace( '/(-[0-9]+)/', '', $menu_item->post_name );
  42. $social_links_content .= '<!-- wp:social-link {"url":"' . $menu_item->url . '","service":"' . $service_name . '"} /-->';
  43. }
  44. $social_links_content .= '</ul><!-- /wp:social-links -->';
  45. return do_blocks( $social_links_content );
  46. }
  47. function append_social_links_block( $parent_content, $social_links_block ) {
  48. if ( empty( $parent_content ) ) {
  49. return $social_links_block;
  50. }
  51. $dom = new domDocument;
  52. $domXPath = new DomXPath( $dom );
  53. // Since the nav block uses HTML5 element names, we need to suppress the warnings it sends when we loadHTML with HTML5 elements.
  54. libxml_use_internal_errors( true );
  55. $dom->loadHTML( $parent_content );
  56. $wp_block_navigation__container = $dom->getElementsByTagName('ul')->item( 0 )->parentNode;
  57. $social_links_node = $dom->createDocumentFragment();
  58. $social_links_node->appendXML( $social_links_block );
  59. if ( ! empty( $wp_block_navigation__container ) ) {
  60. $wp_block_navigation__container->appendChild( $social_links_node );
  61. }
  62. $navigation_block = $dom->getElementsByTagName('nav')->item( 0 );
  63. return $dom->saveXML( $navigation_block );
  64. }
  65. function blockbase_social_menu_render( $block_content, $block ) {
  66. if ( blockbase_condition_to_render_social_menu( $block_content, $block ) ) {
  67. $social_links_block = get_social_menu_as_social_links_block( $block );
  68. return append_social_links_block( $block_content, $social_links_block );
  69. }
  70. return $block_content;
  71. }
  72. /**
  73. * Hijack the render of the menu block to inject a social menu.
  74. */
  75. add_filter( 'render_block', 'blockbase_social_menu_render', 10, 2 );