目錄
兩種方式自訂主題
我們可以修改什麼
參考文獻
首頁 後端開發 php教程 修改子主題中父主題的行為

修改子主題中父主題的行為

Sep 04, 2023 am 09:05 AM

修改子主題中父主題的行為

什麼是子主題?子主題是一項有用的 WordPress 功能,它允許開發人員無需從頭開始建立新模板,而是利用現有主題中已有的所有功能。

但是,有時,我們為網站選擇的父主題可能具有一些我們不需要的功能(或者我們需要進行自訂以最適合我們的需求),例如自訂貼文類型使用不同的slug、簡碼、JavaScript 函式庫、我們不使用的圖片大小等等...


兩種方式自訂主題

雖然透過直接編輯主題可以輕鬆實現我們想要的目標,但每次更新主題時我們都必須再次進行所有自訂。這可能會令人沮喪,因此還有另一種選擇:我們可以建立一個子主題並使用>functions.php>檔案來修改父主題 > 特點。這樣我們就可以在每次發布新版本時升級父主題,而不會失去我們的自訂內容。

在我們討論更具體的細節之前,先簡單說明主題外觀:我們可以透過匯入子主題的style.css 檔案來修改顏色、背景、排版和佈局父style .css 並覆寫我們想要更改的樣式。

為了對佈局進行更多控制,我們還可以按照 Abbas Suterwala 在他的帖子中的建議,並在子主題中克隆父自訂模板檔案:

然後子主題可以選擇覆寫其他模板文件,例如 author.phpcategory.php 等。 WordPress 框架首先查找模板檔案在子主題目錄中,如果沒有找到,將從父目錄中取得它。


我們可以修改什麼

透過子主題的functions.php檔案我們可以處理:

  • 主題功能
  • 自訂貼文類型和分類
  • 選單和側邊欄
  • 小部件
  • 簡碼
  • 其他圖像尺寸
  • 元框
  • JavaScript 與 CSS
  • 父主題操作與篩選器

那麼,假設我們有這樣的網站架構:

  • htdocswww
    • #wp-內容
      • 主題
        • foo-theme主題的目錄 - 它不會被修改)
          • functions.php
          • ##header.php
          • ##style.css
          • #其他範本檔案...
        • #foo-theme-child子主題的目錄)
          • functions.php(我們將使用來自訂父主題的檔案)
          • header.php(覆寫父主題的header.php
          • style.css(這是子主題中必需的文件,必須命名為style.css

讓我們開始吧:在 /wp-content/themes/foo-theme-child/ 目錄中建立一個空的 functions.php 檔案。

在大多數情況下,我們將使用通用的 wp_tuts_remove_features() 函數,掛鉤到 WordPress after_setup_theme 操作。我們也將 10 設定為第三個參數(優先權),因此我們確定該函數在父函數之前觸發。

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

function remove_parent_theme_features() {
	// our code here
}
登入後複製

1.刪除主題功能

一些父主題透過 add_theme_support 函數為 WordPress 新增功能。

可用功能有:

  • 後格式
  • #後縮圖
  • #自訂背景
  • #自訂標頭
  • #自動提要連結

#所以要刪除它們,我們可以修改functions.php檔案中的remove_parent_theme_features()函數。

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.刪除自訂貼文類型和分類

刪除自訂帖子類型和自訂分類法很簡單:如果父functions.php 檔案透過parent_movie_add_post_type() 函數新增Movie 自訂帖子類型:

// 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 );
}
登入後複製

...借助我們的子 functions.php 文件,我們可以自訂它:

// 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 );
}
登入後複製

我們也可以在不取消註冊帖子類型的情況下僅刪除某些特徵,例如,如果我們想用帖子特色圖像替換摘錄字段,我們可以這樣修改函數:

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' );
}
登入後複製

您可以在 WordPress Codex 中的 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' );
登入後複製

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

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


參考文獻

  • 子主題基礎知識和在 WordPress 中建立子主題
  • WordPress Codex 文件
    • 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 父主題集合
  • 專題主題架構

以上是修改子主題中父主題的行為的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章討論了框架中的基本安全功能,以防止漏洞,包括輸入驗證,身份驗證和常規更新。

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

See all articles