Website-Suche

Theme-Anpasser: Bedingungen, untergeordnete Themes und Plugins


  1. <span>1. Einführung in den WordPress Theme Customizer
  2. <span>2. Interaktion mit dem WordPress Theme Customizer
  3. <span>3. WordPress-Theme-Customizer-Boilerplate
  4. <span>4. Erweitern des WordPress-Theme-Customizer-Boilerplates
  5. 5. Derzeit gelesen: Theme Customizer: Bedingungen, untergeordnete Themes und Plugins

Bisher haben wir gesehen, wie einfach es ist, Theme-Optionen mit Theme Customizer Boilerplate und seinen Hooks zu verwalten. Wie Sie sich wahrscheinlich erinnern, bestand der wichtigste Schritt darin, sich in den Filter-Hook ‘thsp_cbp_options_array’ einzubinden und ihm eine Reihe von Optionen zu übergeben, die Sie in Ihrem Theme verwenden möchten.

Ich bin mir sicher, dass Sie bereits mit WordPress-Aktions- und Filter-Hooks (Plugin-API) und ihrer Funktionsweise vertraut sind, aber nur für den Fall, hier ist eine kurze Zusammenfassung (am Beispiel von Filter-Hooks). Sie können Ihre benutzerdefinierte Funktion definieren und sie mit der Funktion add_filter in einen vorhandenen Filter einbinden:

add_filter( $tag, $function_to_add, $priority, $accepted_args );

Konzentrieren wir uns auf das Prioritätsargument. Der Standardwert ist 10. Wenn Sie also keine andere Zahl verwenden, ist dies die Ausführungspriorität Ihrer Funktion. Wenn Sie die Zahl verringern, wird Ihre Funktion früher ausgeführt. Wenn Sie also so etwas tun:

// Adding first message
function my_theme_add_first_message( $content ) {
	$content .= '<p>First Message</p>';
	return $content;
}
add_filter( 'the_content', 'my_theme_add_first_message', 1 );

// Adding second message
function my_theme_add_second_message( $content ) {
	$content .= '<p>Second Message</p>';
	return $content;
}
add_filter( 'the_content', 'my_theme_add_second_message', 2 );

Wenn Sie die Funktion „_content“ in single.php oder einer anderen Vorlage aufrufen, wird der Inhalt des Beitrags angezeigt, gefolgt von der ersten Nachricht und anschließend der zweiten Nachricht. Nicht weil das ihre Reihenfolge in diesem Codeausschnitt ist, sondern wegen des Ausführungsprioritätsparameters. Stellen Sie sich Haken vor, als wären sie Schneebälle, die den Hügel hinunterrollen und auf ihrem Weg alle möglichen Dinge aufsammeln.

Wie trifft dies auf Theme Customizer Boilerplate zu?

Sie können sich über die Datei „function.php“ Ihres Themes mit 'thsp_cbp_options_array' verbinden, indem Sie eine benutzerdefinierte Funktion (z. B. my_theme_options_array) verwenden, deren Prioritätswert auf 1 gesetzt ist. Das bedeutet jede andere Funktion, die sich mit 'thsp_cbp_options_array verbindet ' Der Filter-Hook erledigt dies NACH der Funktion my_theme_options_array, die Sie bereits definiert haben. Schauen Sie sich dieses Beispiel an:

function my_theme_options_array() {
	// Using helper function to get default required capability
	$thsp_cbp_capability = thsp_cbp_capability();

	$options = array(
		// Section ID
		'my_theme_new_section' => array(

			'existing_section' => false,
			'args' => array(
				'title' => __( 'New Section', 'my_theme_textdomain' ),
				'priority' => 10
			),
			'fields' => array(
				/*
				 * Radio field
				 */
				'my_radio_button' => array(
					'setting_args' => array(
						'default' => 'option-2',
						'type' => 'option',
						'capability' => $thsp_cbp_capability,
						'transport' => 'refresh',
					),					
					'control_args' => array(
						'label' => __( 'My Radio Button', 'my_theme_textdomain' ),
						'type' => 'radio', // Radio control
						'choices' => array(
							'option-1' => array(
								'label' => __( 'Option 1', 'my_theme_textdomain' )
							),
							'option-2' => array(
								'label' => __( 'Option 2', 'my_theme_textdomain' )
							),
							'option-3' => array(
								'label' => __( 'Option 3', 'my_theme_textdomain' )
							)
						),					
						'priority' => 3
					)
				)
			)
		)
	);
	
	return $options;
}
add_filter( 'thsp_cbp_options_array', 'my_theme_options_array', 1 );

Dadurch wird dem Theme Customizer ein neuer Abschnitt mit einem Feld namens „Mein Optionsfeld“ hinzugefügt. Dann entwickeln Sie oder eine andere Person ein untergeordnetes Thema für Ihr Thema und entscheiden sich dafür, „Neuer Abschnitt“ beizubehalten. Anstelle von „Mein Optionsfeld“ ist es jedoch möglicherweise besser, „Mein Kontrollkästchen“ zu verwenden. Einfach:

function my_child_theme_options_array( $options ) {
	// Using helper function to get default required capability
	$thsp_cbp_capability = thsp_cbp_capability();

	/*
	 * This time, we're only editing fields in my_theme_new_section in the $options array
	 */	
	$options['my_theme_new_section']['fields'] = array(
		'my_checkbox_field' => array(
			'setting_args' => array(
				'default' => true,
				'type' => 'option',
				'capability' => $thsp_cbp_capability,
				'transport' => 'refresh',
			),					
			'control_args' => array(
				'label' => __( 'My Checkbox', 'my_theme_textdomain' ),
				'type' => 'checkbox', // Checkbox field control
				'priority' => 2
			)
		)
	);
	
	return $options;
}
add_filter( 'thsp_cbp_options_array', 'my_child_theme_options_array', 2 );

Ist Ihnen aufgefallen, dass ich den Parameter „$options“ nicht an „my_theme_options_array“ übergeben habe, sondern dies in der Funktion „my_child_theme_options_array“ getan habe? Das liegt daran, dass ich, als ich mich zum ersten Mal in den 'thsp_cbp_options_array'-Hook einhing, die Beispieloptionen des Theme Customizer Boilerplate überschreiben wollte. Als ich mich dann wieder von meinem untergeordneten Thema aus einloggte, wollte ich die Optionen des übergeordneten Themas nicht vollständig löschen, sondern nur leicht bearbeiten. Deshalb beschäftige ich mich nur mit $options[‘my_theme_new_section’][‘fields’], nicht mit dem gesamten $options-Array.

Natürlich können Sie sich auch mehrmals in den 'thsp_cbp_options_array'-Filter-Hook Ihres übergeordneten Themes einbinden. Nehmen wir an, Sie haben sich entschieden, keine Plugin-Gebietsfunktionen zu Ihrem Theme hinzuzufügen und lassen die Plugins tun, was sie wollen. Das soll es. Jetzt möchten Sie einige Theme Customizer-Optionen nur anzeigen, wenn ein bestimmtes Plugin aktiv ist. Nochmal ganz einfach:

function my_plugin_dependency_options_array( $options ) {
	// Using helper function to get default required capability
	$thsp_cbp_capability = thsp_cbp_capability();

	/*
	 * Only adding my_plugin_dependency_section if 'test-plugin.php' is active
	 */	
	if ( is_plugin_active( 'test-plugin/test-plugin.php' ) ) {
	
		$options['my_plugin_dependency_section'] = array(
			'existing_section' => false,
			'args' => array(
				'title' => __( 'Plugin Dependency', 'my_theme_textdomain' ),
				'priority' => 10
			),
			'fields' => array(
				/*
				 * Text field
				 */
				// Field ID
				'new_text_field' => array(
					'setting_args' => array(
						'default' => __( '', 'my_theme_textdomain' ),
						'type' => 'option',
						'capability' => $thsp_cbp_capability,
						'transport' => 'refresh',
					),					
					'control_args' => array(
						'label' => __( 'Only shows if', 'my_theme_textdomain' ),
						'type' => 'text', // Text field control
						'priority' => 5
					)
				),
			)
		);
	
	}
	
	return $options;
}
add_filter( 'thsp_cbp_options_array', 'my_plugin_dependency_options_array', 3 );

Möchten Sie ein Kernfunktions-Plugin entwickeln, das mit Ihrem Theme verwendet werden kann (wie Sie sollten)? Sie können ‘thsp_cbp_options_array’ auch über eine Ihrer Plugin-Dateien einbinden, genauso wie Sie es über die function.php-Datei eines Themes tun würden.

Seien Sie nicht verrückt nach Optionen

Jedes Mal, wenn Sie einem von Ihnen entwickelten Theme Optionen hinzufügen, müssen Sie eines der Grundprinzipien von WordPress im Hinterkopf behalten: Entscheidung statt Optionen. Es ist leicht, sich dazu hinreißen zu lassen, Benutzeroptionen für jedes noch so kleine Detail Ihres Themes hinzuzufügen, aber das tut niemandem einen Gefallen. Ich hoffe, dass diese wenigen Tricks, insbesondere das Hinzufügen von Plugin-abhängigen Optionen, dazu beitragen, die Anzahl der Optionen Ihres Themes so gering wie möglich zu halten.

Wenn Ihr Theme schließlich Optionen für Dinge wie jeden Randradius jedes einzelnen Elements hat, ist es kein Theme, sondern ein WYSIWYG-Editor und wahrscheinlich kein großartiger Editor.

Ein weißes Hemd kauft man nicht, weil man es mit etwas mehr Aufwand in eine Tischdecke verwandeln kann, sondern weil es einem gefällt, weil es „weiß“ ist. Auch WordPress-Themes sollten so sein, sie sollten Inhalte auf eine bestimmte Art und Weise präsentieren und nicht versuchen, alles auf jede erdenkliche Art und Weise zu machen. Wenn Sie ein Theme-Entwickler sind, ist es Ihre Aufgabe, sicherzustellen, dass die Erwartungen der Benutzer ihren Erwartungen entsprechen.