social-navigation.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 blockbase_theme_has_navigation_social_links_settings( $theme_data ) {
  20. return $theme_data
  21. && array_key_exists( 'settings', $theme_data )
  22. && array_key_exists( 'custom', $theme_data['settings'] )
  23. && array_key_exists( 'navigation/social-links', $theme_data['settings']['custom'] )
  24. && array_key_exists( 'color', $theme_data['settings']['custom']['navigation/social-links'] )
  25. && array_key_exists( 'text', $theme_data['settings']['custom']['navigation/social-links']['color'] );
  26. }
  27. function get_social_menu_as_social_links_block( $block ) {
  28. if ( empty( $block['attrs']['__unstableSocialLinks'] ) ) {
  29. return false;
  30. }
  31. $social_links_location = $block['attrs']['__unstableSocialLinks'];
  32. $nav_menu_locations = get_nav_menu_locations();
  33. $social_menu_id = $nav_menu_locations[ $social_links_location ];
  34. $class_name = 'is-style-logos-only';
  35. if ( ! empty( $block['attrs']['itemsJustification'] ) ) {
  36. $class_name .= ' items-justified-' . $block['attrs']['itemsJustification'];
  37. }
  38. // Get color for social icons.
  39. $theme_data = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data()->get_raw_data();
  40. $social_links_icon_color_value = 'var(--wp--custom--color--primary)';
  41. $social_links_icon_color = 'primary';
  42. if ( blockbase_theme_has_navigation_social_links_settings( $theme_data ) ) {
  43. $social_links_icon_color_value = $theme_data['settings']['custom']['navigation/social-links']['color']['text'];
  44. $social_links_icon_color = preg_replace( '/var\(--wp--custom--color--(.+)\)/', '$0 --> $2 $1', $social_links_icon_color_value );
  45. }
  46. $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 . '">';
  47. $menu = wp_get_nav_menu_items( $social_menu_id );
  48. if ( $menu ) {
  49. foreach ( $menu as $menu_item ) {
  50. $service_name = preg_replace( '/(-[0-9]+)/', '', $menu_item->post_name );
  51. $service_name = preg_replace( '/(-profile)/', '', $service_name );
  52. $social_links_content .= '<!-- wp:social-link {"url":"' . $menu_item->url . '","service":"' . $service_name . '"} /-->';
  53. }
  54. }
  55. $social_links_content .= '</ul><!-- /wp:social-links -->';
  56. return do_blocks( $social_links_content );
  57. }
  58. function append_social_links_block( $parent_content, $social_links_block ) {
  59. if ( empty( $parent_content ) ) {
  60. return $social_links_block;
  61. }
  62. $dom = new domDocument;
  63. $domXPath = new DomXPath( $dom );
  64. // Since the nav block uses HTML5 element names, we need to suppress the warnings it sends when we loadHTML with HTML5 elements.
  65. libxml_use_internal_errors( true );
  66. $dom->loadHTML( '<?xml encoding="utf-8" ?>' . $parent_content );
  67. $wp_block_navigation__container = $dom->getElementsByTagName( 'ul' )->item( 0 )->parentNode;
  68. $social_links_node = $dom->createDocumentFragment();
  69. $social_links_node->appendXML( $social_links_block );
  70. if ( ! empty( $wp_block_navigation__container ) ) {
  71. $wp_block_navigation__container->appendChild( $social_links_node );
  72. }
  73. $navigation_block = $dom->getElementsByTagName( 'nav' )->item( 0 );
  74. return $dom->saveXML( $navigation_block );
  75. }
  76. function blockbase_social_menu_render( $block_content, $block ) {
  77. if ( blockbase_condition_to_render_social_menu( $block_content, $block ) ) {
  78. $social_links_block = get_social_menu_as_social_links_block( $block );
  79. return append_social_links_block( $block_content, $social_links_block );
  80. }
  81. return $block_content;
  82. }
  83. /**
  84. * Hijack the render of the menu block to inject a social menu.
  85. */
  86. add_filter( 'render_block', 'blockbase_social_menu_render', 10, 2 );