= 1.05 / ( $l + 0.05 ) ) ? '#111111' : '#FFFFFF'; } function djcockpit_subdomain() { return djcockpit_subdomain_sauber( get_option( 'djcockpit_subdomain', '' ) ); } /** * Die Grundzeile. Die Vorlage zwischen DJC_GRUNDZEILE ist einbindenCode('djcockpit-vorlage') * aus DJCockpit, Zeichen für Zeichen (Test: app/lib/wordpressPlugin.test.mjs). */ function djcockpit_grundzeile( $sub ) { $vorlage = <<<'DJC_GRUNDZEILE' DJC_GRUNDZEILE; return str_replace( 'djcockpit-vorlage', $sub, $vorlage ); } /** * Der Platzhalter. Die Vorlage ist einbindenPlatzhalter('djcockpit-vorlage', '#ABCDEF', * 'VORLAGETEXT') aus DJCockpit, Zeichen für Zeichen (gleicher Test). */ function djcockpit_platzhalter( $sub, $akzent, $beschriftung ) { $vorlage = <<<'DJC_PLATZHALTER'
DJC_PLATZHALTER; $farbe = djcockpit_akzent_sauber( $akzent ); $text = str_replace( array( '<', '>', '&', '"', "'" ), '', (string) $beschriftung ); return str_replace( array( 'djcockpit-vorlage', 'background:#ABCDEF', 'color:#111111', 'VORLAGETEXT' ), array( $sub, 'background:' . $farbe, 'color:' . djcockpit_schrift_auf_akzent( $farbe ), $text ), $vorlage ); } // ─── Website ────────────────────────────────────────────────────────────── add_action( 'wp_footer', function () { $sub = djcockpit_subdomain(); if ( '' === $sub ) { return; // Ohne Subdomain gibt das Plugin nichts aus. } echo "\n" . djcockpit_grundzeile( $sub ) . "\n"; // phpcs:ignore WordPress.Security.EscapeOutput -- Subdomain auf [a-z0-9-] geprüft, Rest fest. }, 100 ); add_shortcode( 'djcockpit', function ( $atts ) { $sub = djcockpit_subdomain(); if ( '' === $sub ) { return ''; } $atts = shortcode_atts( array( 'text' => 'Termin prüfen' ), $atts, 'djcockpit' ); return djcockpit_platzhalter( $sub, get_option( 'djcockpit_akzent', '#00D4FF' ), $atts['text'] ); } ); // ─── Einstellungen ──────────────────────────────────────────────────────── add_action( 'admin_menu', function () { add_options_page( 'DJCockpit', 'DJCockpit', 'manage_options', 'djcockpit', 'djcockpit_einstellungsseite' ); } ); add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), function ( $links ) { array_unshift( $links, 'Einstellungen' ); return $links; } ); /** Fragt bei DJCockpit nach, ob es die Subdomain gibt. Nur beim Speichern. */ function djcockpit_pruefen( $sub ) { $antwort = wp_remote_get( 'https://' . DJCOCKPIT_DOMAIN . '/api/einbinden/' . rawurlencode( $sub ), array( 'timeout' => 8 ) ); if ( is_wp_error( $antwort ) ) { return array( 'stand' => 'netz' ); } // „Gibt es nicht" nur, wenn DJCockpit das sagt (404). Jede andere Antwort — // Serverfehler, unlesbar — heißt „gerade nicht erreichbar": noch einmal // speichern hilft dann (bis 1.0.1 kam hier fälschlich „gibt es nicht"). $code = (int) wp_remote_retrieve_response_code( $antwort ); if ( 404 === $code ) { return array( 'stand' => 'unbekannt' ); } if ( 200 !== $code ) { return array( 'stand' => 'netz' ); } $k = json_decode( wp_remote_retrieve_body( $antwort ), true ); if ( ! is_array( $k ) || empty( $k['subdomain'] ) ) { return array( 'stand' => 'netz' ); } return array( 'stand' => 'ok', 'name' => isset( $k['djName'] ) ? sanitize_text_field( $k['djName'] ) : '', 'akzent' => isset( $k['akzent'] ) ? djcockpit_akzent_sauber( $k['akzent'] ) : '#00D4FF', ); } add_action( 'admin_post_djcockpit_speichern', function () { if ( ! current_user_can( 'manage_options' ) ) { wp_die( 'Keine Berechtigung.' ); } check_admin_referer( 'djcockpit_speichern' ); $roh = isset( $_POST['djcockpit_subdomain'] ) ? sanitize_text_field( wp_unslash( $_POST['djcockpit_subdomain'] ) ) : ''; // Aus „dj-max.djcockpit.de" oder einer ganzen Adresse nur den vorderen Teil nehmen. $roh = preg_replace( '#^https?://#i', '', $roh ); $roh = preg_replace( '#\.' . preg_quote( DJCOCKPIT_DOMAIN, '#' ) . '.*$#i', '', $roh ); $sub = djcockpit_subdomain_sauber( $roh ); $ziel = admin_url( 'options-general.php?page=djcockpit' ); if ( '' === trim( $roh ) ) { delete_option( 'djcockpit_subdomain' ); delete_option( 'djcockpit_name' ); wp_safe_redirect( add_query_arg( 'djc', 'leer', $ziel ) ); exit; } if ( '' === $sub ) { wp_safe_redirect( add_query_arg( 'djc', 'ungueltig', $ziel ) ); exit; } $p = djcockpit_pruefen( $sub ); if ( 'ok' === $p['stand'] ) { update_option( 'djcockpit_subdomain', $sub ); update_option( 'djcockpit_name', $p['name'] ); update_option( 'djcockpit_akzent', $p['akzent'] ); } wp_safe_redirect( add_query_arg( 'djc', $p['stand'], $ziel ) ); exit; } ); function djcockpit_einstellungsseite() { if ( ! current_user_can( 'manage_options' ) ) { return; } $sub = djcockpit_subdomain(); $name = get_option( 'djcockpit_name', '' ); $stand = isset( $_GET['djc'] ) ? sanitize_key( wp_unslash( $_GET['djc'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification -- nur Anzeige. $meldung = array( 'ok' => array( 'success', 'Verbunden. Ab jetzt öffnet jeder Link auf deine Anfrageseite das Formular als Fenster.' ), 'leer' => array( 'info', 'Die Verbindung ist aufgehoben. Deine Website zeigt wieder die normalen Links.' ), 'ungueltig' => array( 'error', 'Das ist keine gültige Subdomain. Erlaubt sind Kleinbuchstaben, Ziffern und Bindestriche, zum Beispiel „dj-max“.' ), 'unbekannt' => array( 'error', 'Diese Subdomain gibt es bei DJCockpit nicht. Du findest deine in DJCockpit unter Einstellungen → Profil & Firma.' ), 'netz' => array( 'warning', 'DJCockpit war gerade nicht erreichbar. Bitte gleich noch einmal speichern.' ), ); ?>Dieses Plugin verbindet deine Website mit DJCockpit, der Software für DJs: Anfragen, Angebote, Rechnungen und Kundenbereich an einem Ort. Ist es verbunden, öffnet jeder Link auf deine DJCockpit-Anfrageseite das Anfrageformular als Fenster über deiner Website — mit Terminprüfung (Ampel). Deine Besucher bleiben auf deiner Seite, die Anfrage landet in DJCockpit.
Schritt für Schritt mit Bildern: Anleitung auf djcockpit.de
Setz [djcockpit] dorthin, wo das Formular stehen soll — im Block-Editor mit dem Block „Shortcode“, in Divi oder Elementor in ein Text- oder Shortcode-Element. Dort steht zuerst ein Knopf „Termin prüfen“, ein Klick zeigt das Formular an dieser Stelle. Eigene Beschriftung: [djcockpit text="Verfügbarkeit prüfen"].
Farbe, hellen oder dunklen Grund und die Ansprache (ihr, du oder Sie) stellst du in DJCockpit ein: Einstellungen → Profil & Firma → „Deine Anfrageseite“ → „Auf deiner Website einbinden“. Das Formular auf deiner Website übernimmt Änderungen innerhalb einer Minute. Nur der Knopf „Termin prüfen“ vom Shortcode behält seine Farbe, bis du hier noch einmal auf „Speichern und prüfen“ klickst. Im selben Kasten in DJCockpit steht auch ein Satz für deine Datenschutzerklärung. Beim Seitenaufruf lädt nichts von DJCockpit — erst der Klick holt das Formular.
Nutzt deine Website ein Cache-Plugin (etwa WP Rocket), leer nach dem Verbinden einmal den Cache.
DJCockpit ist installiert. Trag deine Subdomain ein, damit das Anfrageformular auf deiner Website erscheint.