Umschalter / Toggle-Switch mit GB umsetzen

Mit einem Toggle bzw. Umschalter können verschiedene Inhalte an der gleichen Stelle angezeigt werden. Die Inhalte können je nach Anordnung im Block-Editor individuell platziert werden, z.b. unterhalb des Schalters oder auch links oder rechts daneben.

Nachfolgend ist das Beispiel zu sehen, dann der Code und am Ende die Struktur im Editor sowie die Blöcke, auf denen die CSS-Klassen anzuwenden sind. CSS kann wahlweise über Customizer-CSS, Child-Theme oder Simple-CSS angewendet werden. JS & PHP kann ebenfalls im Child-Theme platziert werden, oder über das Code Snippet bzw. WPCodeBox Plugin.

Beispiel

Eine erste Überschrift

Und hier eine zweite Überschrift

Code (click to copy)

CSS

.editor-styles-wrapper .gb-button-wrapper .gb-button.trigger,
.site .gb-button-wrapper .gb-button.trigger {
  cursor: pointer;
  user-select: none;
  padding: 5px !important;
  border-radius: 2em;
  height: 25px;
  width: 50px;
  align-items: center;
  color: var(--base-3);
  background: var(--accent);
}
.editor-styles-wrapper .gb-button-wrapper .gb-button.trigger .gb-icon,
.site .gb-button-wrapper .gb-button.trigger .gb-icon {
    margin-right: 25px;
    margin-left: 0;
    transition: linear .15s all;
}

.editor-styles-wrapper .gb-button-wrapper .gb-button.trigger.toggled .gb-icon,
.site .gb-button-wrapper .gb-button.trigger.toggled .gb-icon {
    margin-left: 25px;
    margin-right: 0;
}

.site .gb-button-wrapper .gb-button.trigger:hover,
.site .gb-button-wrapper .gb-button.trigger:focus {
  color: var(--base-3);
  background: var(--accent);
}

.site .containers {
  overflow: hidden;
}

.site .containers > .gb-inside-container > .gb-container {
  transform: scale(0); 
  height: 0;
  margin-bottom: 0;
  transition:  all ease .25s;
  overflow: hidden;
}

.site .containers > .gb-inside-container > .gb-container a {
  display: none;
}
.site .containers > .gb-inside-container > .gb-container.is-active a {
  display: unset;
}

.site .containers > .gb-inside-container > .gb-container.is-active {
  transform: scale(1);
}

JavaScript

window.addEventListener("DOMContentLoaded", (event) => {
  const tabSection = Array.from(document.querySelectorAll(".toggle")); // wrapper
  tabSection.forEach((section) => {
    let trigger = section.querySelector(".trigger");
    trigger.setAttribute("tabindex", 0);
    let contentWrapper = section.querySelector('.containers');

    let content = Array.from( contentWrapper.querySelectorAll(".gb-inside-container > .gb-container") );
    content[0].classList.add("is-active");
    content[0].style.height = content[0].scrollHeight + "px";
    
    function toggleEvents(event) {
      event.preventDefault();
      if (event.keyCode === 13 || event.button == 0 ) {
        trigger.classList.toggle("toggled");
        content.forEach((elem) => elem.classList.toggle("is-active"));
         content.forEach( (element) => {
          if ( element.classList.contains("is-active") ) {
            element.style.height = element.scrollHeight + "px";
          } else {
            element.style.height = 0;
          }
        });
      }
    }
      ["click", "keyup"].forEach((event) => trigger.addEventListener(event, toggleEvents));
  });
});

PHP

<?php
function thisbit_toggle_for_generateblocks() {
	global $post;
	$blocks = parse_blocks( $post->post_content );
	foreach( $blocks as $block ) {
		$block['attrs']['className'] = ""; // initiate className to fix error reporting index undefined
		if( $block['attrs']['className'] && $block['attrs']['className'] !== 'toggle' ) { return;
		} else {
			wp_enqueue_style( 'thisbit-toggle', get_stylesheet_directory_uri() . '/assets/css/toggle.css', false, '0.0.1', 'all');
			wp_enqueue_script( 'thisbit-toggle', get_stylesheet_directory_uri() . '/assets/js/toggle.js', '', '0.0.1', true );
			return;
		}
	}
}
add_action( 'wp_enqueue_scripts', 'thisbit_toggle_for_generateblocks', 9999 );


function thisbit_toggle_for_generateblocks_admin() {
	wp_enqueue_style( 'thisbit-toggle', get_stylesheet_directory_uri() . '/assets/css/toggle.css', false, '0.0.1', 'all');
}
add_action( 'enqueue_block_assets', 'thisbit_toggle_for_generateblocks_admin', 9999 );

Struktur – Wie die GB-Blöcke anzuordnen sind und CSS-Klassen anzuwenden sind