Heim  >  Artikel  >  Backend-Entwicklung  >  Ändern Sie das Verhalten des übergeordneten Themas im untergeordneten Thema

Ändern Sie das Verhalten des übergeordneten Themas im untergeordneten Thema

PHPz
PHPzOriginal
2023-09-04 09:05:05960Durchsuche

Ändern Sie das Verhalten des übergeordneten Themas im untergeordneten Thema

Was ist ein Unterthema? Untergeordnete Themes sind eine nützliche WordPress-Funktion, die es Entwicklern ermöglicht, das Erstellen einer neuen Vorlage von Grund auf zu vermeiden und stattdessen alle bereits in einem vorhandenen Theme verfügbaren Funktionen zu nutzen.

Aber manchmal verfügt das übergeordnete Theme, das wir für unsere Website auswählen, über einige Funktionen, die wir nicht benötigen (oder die wir an unsere Bedürfnisse anpassen müssen), wie z. B. benutzerdefinierte Beitragstypen mit verschiedenen Slugs, Shortcodes und JavaScript Bibliotheken, Bildgrößen, die wir nicht verwenden, und mehr ...


Zwei Möglichkeiten, das Thema anzupassen

Obwohl es einfach ist, das zu erreichen, was wir wollen, indem wir das Theme direkt bearbeiten, müssen wir jedes Mal, wenn wir das Theme aktualisieren, alle Anpassungen erneut vornehmen. Das kann frustrierend sein, daher gibt es eine andere Möglichkeit: Wir können ein untergeordnetes Thema erstellen und die Datei >functions.php> verwenden, um die Funktionen des übergeordneten Themas> zu ändern. Auf diese Weise können wir das übergeordnete Theme jedes Mal aktualisieren, wenn eine neue Version veröffentlicht wird, ohne dass unsere benutzerdefinierten Inhalte verloren gehen.

Bevor wir auf genauere Details eingehen, ein kurzer Hinweis zum Erscheinungsbild des Themes: Wir können die Farben, den Hintergrund, die Typografie und das Layout ändern, indem wir die style.css-Datei des untergeordneten Themes importieren und die übergeordnete style.css überschreiben, wie wir es getan haben Ich möchte einen geänderten Stil.

Um mehr Kontrolle über das Layout zu haben, können wir auch dem Vorschlag von Abbas Suterwala in seinem Beitrag folgen und die übergeordnete benutzerdefinierte Vorlagendatei im untergeordneten Thema klonen:

Das Child-Theme kann dann optional andere Vorlagendateien wie author.php, category.php usw. überschreiben. Das WordPress-Framework sucht zunächst im untergeordneten Theme-Verzeichnis nach der Vorlagendatei und ruft sie, wenn sie nicht gefunden wird, aus dem übergeordneten Verzeichnis ab.


Was können wir ändern

Mit der Datei functions.php des Child-Themes können wir Folgendes verarbeiten:

  • Themenfunktion
  • Benutzerdefinierte Beitragstypen und -kategorien
  • Menü und Seitenleiste
  • Widgets
  • Shortcode
  • Andere Bildgrößen
  • Meta-Box
  • JavaScript und CSS
  • Aktionen und Filter für übergeordnete Themen

Nehmen wir an, wir haben diese Website-Struktur:

  • htdocs oder www
    • WP-Inhalt
      • Thema
        • foo-theme (das Verzeichnis des übergeordneten Themes – es wird nicht geändert)
          • functions.php
          • header.php
          • style.css
          • Andere Vorlagendateien...
        • foo-theme-child (Verzeichnis von Child-Theme)
          • functions.php (die Datei, die wir zum Anpassen des übergeordneten Themas verwenden werden)
          • header.php (überschreibt header.php des übergeordneten Themes)
          • style.css (Dies ist eine erforderliche Datei im untergeordneten Theme und muss style.css heißen)

Lass uns beginnen: Erstellen Sie eine leere Datei functions.php im Verzeichnis /wp-content/themes/foo-theme-child/.

In den meisten Fällen verwenden wir die generische wp_tuts_remove_features() 函数,挂钩到 WordPress after_setup_theme 操作。我们还将 10-Einstellung als drittes Argument (Priorität), damit wir sicher sind, dass die Funktion vor der übergeordneten Funktion ausgelöst wird.

add_action( 'after_setup_theme', 'remove_parent_theme_features', 10 );

function remove_parent_theme_features() {
	// our code here
}

1.Themenfunktion löschen

Einige übergeordnete Themes fügen WordPress über add_theme_support Funktionen Funktionalität hinzu.

Verfügbare Funktionen sind:

  • 后格式
  • 后缩略图
  • 自定义背景
  • 自定义标头
  • 自动提要链接

Um sie zu löschen, können wir die Funktionen in der Datei functions.phpremove_parent_theme_features() ändern.

function remove_parent_theme_features() {
	remove_theme_support( 'post-formats' );
	remove_theme_support( 'post-thumbnails' );
	remove_theme_support( 'custom-background' );
	remove_theme_support( 'custom-header' );
	remove_theme_support( 'automatic-feed-links' );
}

2.Benutzerdefinierte Beitragstypen und -kategorien löschen

Das Entfernen benutzerdefinierter Beitragstypen und benutzerdefinierter Taxonomien ist einfach: Wenn die übergeordnete Datei functions.php über die parent_movie_add_post_type()Funktion Movie hinzugefügt wird, wird der benutzerdefinierte Beitragstyp:

hinzugefügt
// PARENT functions.php

add_action( 'after_setup_theme', 'parent_movie_add_post_type' );

function parent_movie_add_post_type() {

	$parent_args = array(
		// other arguments...
		'rewrite' => array( 'slug' => 'movie' ),
		'supports' => array( 'title', 'editor', 'author', 'excerpt' )
	);
	register_post_type( 'movie', $parent_args );
}

...mit Hilfe unserer Unterdatei functions.php können wir es anpassen:

// CHILD functions.php

function remove_parent_theme_features() {
	// remove Movie Custom Post Type
	remove_action( 'init', 'parent_movie_add_post_type' );
	/*
	alternatively, we can add our custom post type to 
	overwrite only some aspects of the parent function
	*/
	add_action( 'init', 'child_movie_post_type' );
}

function child_movie_post_type() {
	$child_args = array(
		// other arguments...
		// change Custom Post slug
		'rewrite' => array( 'slug' => 'child-movie' ),
		// remove excerpts and add post thumbs
		'supports' => array( 'title', 'editor', 'author', 'thumbnail' )
	);

	register_post_type( 'movie', $child_args );
}

Wir können auch nur bestimmte Funktionen entfernen, ohne den Beitragstyp abzumelden. Wenn wir beispielsweise das Auszugsfeld durch das Beitragsbild ersetzen möchten, können wir die Funktion wie folgt ändern:

function remove_parent_theme_features() {
	add_action( 'init', 'wp_tuts_remove_post_feature' );
}

function wp_tuts_remove_post_feature() {
	// remove excerpt
	remove_post_type_support( 'movie', 'excerpt' );
	// add post thumbs
	add_post_type_support( 'movie', 'thumbnail' );
}

Die vollständige Liste der entfernbaren Funktionen finden Sie im WordPress-Codex unter remove_post_type_support.

与自定义帖子类型类似,您可以通过 parent_taxonomy() 函数删除在父主题中添加的自定义分类,方法如下:

function wp_tuts_after_setup_theme() {
	remove_action( 'init', 'parent_taxonomy' );
}

3.删除菜单

我们可以通过 unregister_nav_menu() 函数删除父主题的菜单。该函数采用一个参数,即 register_nav_menu() 函数中使用的菜单位置标识符 slug。

如果父主题注册了标题菜单

// PARENT functions.php

add_action( 'after_setup_theme', 'register_my_menu' );

function register_my_menu() {
	register_nav_menu( 'header-menu', __( 'Header Menu' ) );
}

我们可以这样删除它:

// CHILD functions.php

function remove_parent_theme_features() {
	unregister_nav_menu( 'header-menu' );
}

要识别已注册的菜单,我们可以在父主题代码中搜索 register_nav_menu() 调用。该函数的第一个参数代表我们可以用来取消注册的菜单 ID(在本例中为 header-menu)。


4.删除小部件和侧边栏

WordPress 附带了一些我们可以停用的默认小部件。此外,我们的父主题可以添加自己的小部件,因此我们可以在主题文件中搜索它们的声明位置并记下它们的名称。通常它们在扩展 WP_Widget 类的 PHP 类中声明:

// PARENT theme
class ParentWidgetName extends WP_Widget {
	// widget code
}

因此,要取消注册小部件,我们使用类名 ParentWidgetName:

add_action( 'widgets_init', 'wp_tuts_parent_unregister_widgets', 10 );

function wp_tuts_parent_unregister_widgets() {

	// remove (some) WordPress default Widgets
	unregister_widget( 'WP_Widget_Pages' );
	unregister_widget( 'WP_Widget_Calendar' );

	// remove Parent registered Widget
	unregister_widget( 'ParentWidgetName' );

	// register a custom Widget (if needed)
	register_widget( 'MyCustomWidget' );
}

// don't forget to add the Widget Class
class MyCustomWidget extends WP_Widget {
	// Custom Widget code
}

对于侧边栏,操作类似:

add_action( 'widgets_init', 'wp_tuts_parent_unregister_sidebars', 10 );

function wp_tuts_parent_unregister_sidebars() {
	// remove a sidebar registered by the Parent Theme
	unregister_sidebar( 'first-footer-widget-area' );
}

要识别已注册的侧边栏,我们可以在父主题的代码中搜索 register_sidebar() 调用。

我们需要做的就是记下侧边栏 ID:

// PARENT functions.php

$args = array(
	'id' => 'first-footer-widget-area',
	// other args...
);

register_sidebar( $args );

5.删除短代码

覆盖或删除短代码很容易,我们只需要这样修改我们的函数:

function remove_parent_theme_features() {
	// remove the parent [gmap] shortcode
	remove_shortcode( 'gmap' );
	// add our [gmap] shortcode
	add_shortcode( 'gmap', 'child_shortcode_gmap' );
}

function child_shortcode_gmap( $atts ) {
	// create our shortcode that overwrites the parent one
}

要识别已注册的短代码,我们可以在父主题代码中搜索 add_shortcode() 调用。第一个参数是我们要查找的参数;-)。


6.删除附加图像尺寸

如果父主题添加了我们不在子主题中使用的新图像尺寸,我们可以在父主题代码中搜索 add_image_size() 调用。在本例中,它们是:custom_size_parent_1custom_size_parent_2。我们通过这种方式重置它们:

add_filter( 'intermediate_image_sizes_advanced', 'remove_parent_image_sizes' );

function remove_parent_image_sizes( $sizes ) {
	unset( $sizes['custom_size_parent_1'] );
	unset( $sizes['custom_size_parent_2'] );
	return $sizes;
}

这很有用,因为每次用户上传图像时,WordPress 都不会创建我们不使用的其他图像尺寸。

要创建自定义图像尺寸,我们可以将其添加到子 functions.php 文件中:

if ( function_exists( 'add_image_size' ) ) {
	// 400 pixels wide and unlimited height
	add_image_size( 'custom_size_child_1', 400, 9999 );
	// 320 pixels wide and 240 px tall, cropped
	add_image_size( 'custom_size_child_2', 320, 240, true );
}

7.删除元框

通过 remove_meta_box() 函数,我们可以删除默认的 WordPress 和父主题元框。

WordPress 默认元框列表可在 WordPress Codex 中的 remove_meta_box() 下找到。该函数具有三个参数:元框 ID、将从中删除的页面、编辑上下文(normaladvancedside)。

如果父主题在帖子编辑屏幕中添加了元框,我们可以通过以下方式禁用它们:

add_action( 'admin_menu' , 'wp_tuts_remove_metaboxes', 99 );

function wp_tuts_remove_metaboxes() {
	// remove default WP Trackback Metabox from Posts editing page
	remove_meta_box( 'trackbacksdiv', 'post', 'normal' );
	// remove a Parent Theme Metabox 'parent_post_foo_metabox'
	remove_meta_box( 'parent_post_foo_metabox', 'post', 'normal' );
}

我们可以通过在父主题代码中搜索 add_meta_boxadd_meta_boxes() 调用来识别父元框。

要删除的元框的 ID 是 add_meta_box() 函数的第一个参数。


8. 删除 JavaScript 和 CSS 样式表

如果父主题添加了我们不需要的 JavaScript 和 CSS 样式:

// PARENT functions.php

add_action( 'wp_print_scripts', 'parent_scripts' );
add_action( 'wp_print_styles', 'parent_styles' );

function parent_scripts() {
	wp_enqueue_script( 'fancybox-parent-js', get_stylesheet_directory_uri() . '/fancybox/jquery.fancybox.pack.js' );
}

function parent_styles() {
	wp_enqueue_style( 'fancybox-parent-css', get_stylesheet_directory_uri() . '/fancybox/jquery.fancybox.css' );
}

我们可以这样删除它们:

// CHILD functions.php

add_action( 'wp_print_scripts', 'child_overwrite_scripts', 100 );
add_action( 'wp_print_styles', 'child_overwrite_styles', 100 );

function child_overwrite_scripts() {
	wp_deregister_script( 'fancybox-parent-js' );
}

function child_overwrite_styles() {
	wp_deregister_style( 'fancybox-parent-css' );
}

要识别已注册的 JavaScript 和 CSS 样式,我们可以在父主题代码中搜索 wp_enqueue_script()wp_enqueue_style() 调用。

该函数的第一个参数是我们可以在 wp_deregister_script()wp_deregister_style() 函数中使用的参数。


9.删除父主题操作和过滤器

某些主题(例如 Thematic)提供了多个挂钩来修改主题行为,而无需更改主题文件。在本例中,Thematic 提供了一个 thematic_header 操作来加载其他操作:

  • thematic_brandingopen()
  • thematic_blogtitle()
  • thematic_blogdescription()
  • thematic_brandingclose()
  • thematic_access()

我们不会详细研究这些函数的作用,可能其中一些函数会在博客标题中打印一些信息:名称、描述等等...在这种情况下,我们可以停用 thematic_blogdescription() 函数这样:

// Unhook default Thematic functions
function unhook_thematic_functions() {
	// we put the position number of the original function (5)
	// for priority reasons
	remove_action( 'thematic_header', 'thematic_blogdescription', 5 );
}
add_action( 'init', 'unhook_thematic_functions' );

在这些情况下,可能很难理解父主题的结构及其工作原理。我的建议是选择一个带有详细文档、良好的支持论坛并在整个代码中提供钩子的父主题。

这肯定会让我们损失更少的开发时间,并使子主题的定制变得更加容易。


Referenzen

  • Grundlagen von Child-Themes und Erstellen von Child-Themes in WordPress
  • WordPress Codex-Dokumentation
    • after_setup_theme
    • remove_action
    • add_theme_support
    • register_post_type
    • add_post_type_support
    • remove_post_type_support
    • register_nav_menu
    • unregister_nav_menu
    • register_widget
    • unregister_widget
    • register_sidebar
    • unregister_sidebar
    • add_shortcode
    • remove_shortcode
    • add_image_size
    • add_meta_box
    • remove_meta_box
    • wp_deregister_script
    • wp_deregister_style
  • WordPress Parent-Theme-Sammlung
  • Thematischer Themenrahmen

Das obige ist der detaillierte Inhalt vonÄndern Sie das Verhalten des übergeordneten Themas im untergeordneten Thema. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn