Rumah  >  Artikel  >  hujung hadapan web  >  Tindakan WordPress lwn Penapis: Ketahui Perbezaannya

Tindakan WordPress lwn Penapis: Ketahui Perbezaannya

WBOY
WBOYasal
2023-08-31 16:25:071320semak imbas

WordPress 操作与过滤器:了解区别

  • Fungsi
  • Action hook
  • Tapis cangkuk
  • Fungsi panggilan terus
  • Kaitkan fungsi ke dalam tindakan
  • Fungsi cangkuk untuk menapis

Aksi dan cangkuk penapis adalah bahagian penting dalam pelbagai API WordPress. Tanpa mereka, fungsi anda dalam tema dan (terutamanya) pemalam adalah terhad.

Tetapi kadangkala mudah untuk mengelirukan kedua-duanya, terutamanya jika WordPress mempunyai kedua-dua cangkuk aksi dan cangkuk penapis dengan nama yang sama.

Dalam artikel ini, saya akan mentakrifkan cangkuk tindakan dan penapis serta menerangkan perbezaan antara mereka, dan saya akan menunjukkan cara menggunakannya dalam tema dan pemalam. Saya juga akan memberikan beberapa contoh bila anda boleh menggunakannya.

Apabila anda menambah tindakan dan menapis cangkuk pada kod anda dalam WordPress (atau fungsi cangkuk padanya), ia membantu untuk memahami cara WordPress memanggil tindakan dan penapis serta mengikut urutan ia berlaku. Saya tidak akan menerangkan secara terperinci tentang perkara ini di sini kerana kami mempunyai tutorial lain yang berfungsi.

Definisi dan Perbezaan

Mari kita mulakan dengan beberapa definisi. Saya juga akan mentakrifkan cangkuk dan fungsi tindakan dan penapis supaya anda boleh melihat perbezaan antara mereka.

Fungsi

Fungsi ialah perkara pertama yang ditemui kebanyakan orang semasa mempelajari pembangunan WordPress; jika anda telah menambahkan kod pada fail functions.php anda, anda akan menulis fungsi.

Fungsi menentukan cara perkara akan berlaku. Anda menulis fungsi untuk menanyakan data, kandungan output atau melaksanakan banyak tugas lain. Anda boleh memanggil (melaksanakan) fungsi secara terus dalam fail templat tema anda, atau anda boleh mengaitkannya untuk tindakan atau menapis cangkuk. Fungsi juga boleh mengandungi teg templat (seperti teg bersyarat) untuk menentukan bila fungsi itu harus digunakan.

Saya akan menunjukkan kepada anda cara yang berbeza untuk melaksanakan fungsi kemudian dalam artikel ini.

Action hook

Kait tindakan (atau tindakan) dicetuskan apabila sesuatu berlaku, seperti pemuatan halaman, pengguna log masuk atau tindakan tersuai yang anda tentukan dalam tema atau pemalam anda.

Anda boleh menambah cangkuk tindakan anda sendiri menggunakan fungsi do_action(), yang akan saya tunjukkan sebentar lagi. Sebarang fungsi yang anda sangkut ke dalam tindakan ini akan dijalankan pada ketika itu dalam kod. do_action() 函数添加自己的操作挂钩,我将很快演示该函数。您挂钩到该操作的任何函数都将在代码中的该点运行。

过滤器挂钩

过滤器挂钩或过滤器控制某些事情如何发生或更改已经输出的内容。您可以使用过滤器以特定格式输出元数据,覆盖插件的文本输出,或者完全阻止某些内容的显示。

您可以使用 apply_filters() 函数在代码中添加过滤器,我将很快演示该函数。正如单词“apply”所示,您将过滤器应用于现有代码,而使用 do_action() 创建的操作在您将函数挂钩到它之前是空的。

使用函数、操作和过滤器

让我们看一些示例,演示如何使用函数、操作和过滤器。首先,我们将研究直接在代码中使用函数,而不将它们附加到挂钩。

直接调用函数

下面是直接在模板文件中调用的函数的示例。在我的客户站点中,我在页脚中添加了版权页,其中包含版权信息。函数如下:

if ( ! function_exists( 'compass_colophon' ) ) {
function compass_colophon() { ?>
    <section class="colophon" role="contentinfo">
		<small class="copyright left">
			<?php echo compass_copyright(); ?>
			<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
			<?php bloginfo( 'name' ); ?>
			</a>
		</small><!-- #copyright -->

		<small class="credits right">
				Powered by <a href="https://wordpress.org/">WordPress</a> and designed by <a href="https://compass-design.co.uk">Compass Design</a>.
			</a>
		</small><!-- #credits -->
	</section><!--#colophon-->
	<?php }
}

这个函数是可插入的,因为我在父主题中使用它;如果我随后在子主题中创建一个具有相同名称的新函数,它将覆盖该函数。注意该函数中还包含另一个函数compass_colophon(),直接在代码中调用。

这个函数位于我的父主题的 functions.php 文件中。我可以直接在我的主题的 footer.php

Tapis cangkuk

Tapis cangkuk atau penapis mengawal bagaimana sesuatu berlaku atau mengubah apa yang sudah dikeluarkan. Anda boleh menggunakan penapis untuk mengeluarkan metadata dalam format tertentu, mengatasi output teks pemalam atau menghalang kandungan tertentu daripada dipaparkan sepenuhnya.

Anda boleh menambah penapis dalam kod menggunakan fungsi apply_filters(), yang akan saya tunjukkan sebentar lagi. Seperti yang ditunjukkan oleh perkataan "apply", anda menggunakan penapis pada kod sedia ada, manakala tindakan yang dibuat dengan do_action() adalah kosong sehingga anda menyambungkan fungsi padanya.

Menggunakan fungsi, tindakan dan penapis

Mari kita lihat beberapa contoh yang menunjukkan cara menggunakan fungsi, operasi dan penapis. Pertama, kita akan melihat menggunakan fungsi secara langsung dalam kod tanpa melampirkannya pada cangkuk.

Fungsi panggilan terus 🎜 Di bawah ialah contoh fungsi yang dipanggil terus dalam fail templat. Dalam tapak pelanggan saya, saya menambah halaman hak cipta dalam pengaki yang mengandungi maklumat hak cipta. Fungsinya adalah seperti berikut: 🎜
compass_colophon();
🎜Fungsi ini boleh dipasang kerana saya menggunakannya dalam tema induk; jika saya kemudian mencipta fungsi baharu dengan nama yang sama dalam tema kanak-kanak, ia akan mengatasi fungsi tersebut. Ambil perhatian bahawa fungsi ini juga mengandungi fungsi lain compass_colophon(), yang dipanggil terus dalam kod. 🎜 🎜Fungsi ini terdapat dalam fail functions.php tema induk saya. Saya boleh memanggilnya terus dalam fail footer.php tema saya seperti ini: 🎜
do_action( 'compass_in_footer' );
🎜Ini akan mengeluarkan kod dalam fungsi di lokasi di mana ia dipanggil dalam tema saya. Anda juga boleh menghantar argumen kepada fungsi dan kemudian menggunakan argumen tersebut di dalam fungsi. 🎜 🎜Seperti yang akan saya tunjukkan kemudian, fungsi ini juga boleh dikaitkan dengan tindakan atau penapis. 🎜 🎜Kaitkan fungsi ke dalam tindakan🎜 🎜Saya akan mempunyai lebih fleksibiliti jika saya melampirkannya pada cangkuk berbanding jika saya memanggil fungsi halaman hak cipta itu secara langsung. 🎜

创建操作挂钩

我可以在 footer.php 文件中的该位置添加一个操作挂钩,而不是在页脚文件中调用 compass_colophon() 函数,方法是添加以下内容:

do_action( 'compass_in_footer' );

do_action() 函数有一个强制参数,即操作的名称。您还可以选择向其添加参数。

将函数挂钩到操作

所以现在我需要将其挂接到我的新操作挂钩,而不是调用我的版权页函数。在我的 functions.php 文件中,我将其添加到我的函数中:

add_action( 'compass_in_footer', 'compass_colophon' );

这将我的函数挂钩到 compass_in_footer 操作,这意味着我的函数内的代码将在代码中放置该操作的位置运行。第一个参数是操作钩子的名称,第二个参数是我的函数的名称。

这样做的一个优点是,您可以将多个函数挂钩到同一个操作,并且您可以设置优先级,以便它们按照您希望的顺序触发。

假设我有另一个函数想要挂钩到我的 compass_in_footer 挂钩,称为 compass_smallprint(),其中包含更多小字:

if ( ! function_exists( compass_smallprint() ) ) {
    function compass_smallprint() {
		// contents of function here
	}
}
add_action( 'compass_in_footer', 'compass_smallprint', 20 );

你可以在这里看到我在我的 add_action() 函数中添加了第三个参数,这是优先级。默认优先级是 10,如果将此留空,则会应用该优先级。因此,因为我没有为 compass_colophon() 函数设置优先级,所以为 compass_smallprint() 函数设置 20 将使该函数在之后运行/em> compass_colophon() 函数。

从操作中取消函数

有时您想停止某个函数的运行。一种方法是创建该函数的虚拟版本,如果它是可插入的,则该函数不执行任何操作。简而言之,可插入函数允许您根据代码的执行顺序覆盖某些行为。您可能还想了解可插入函数的基础知识及其用法,以便在您还没有听说过它们时能够跟上。

实现此目的的另一种方法是使用操作挂钩。如果该函数已挂钩到操作挂钩,则可以使用 remove_action() 函数来执行此操作。因此,如果我想阻止 compass_smallprint() 函数运行,我可以将其从 compass_in_footer 操作中取消挂钩,如下所示:

remove_action( 'compass_in_footer', 'compass_smallprint', 20 );

remove_action() 函数具有三个参数:操作挂钩的名称、函数的名称以及函数最初挂钩到操作的优先级。您必须添加优先级才能使其发挥作用。

如果您想阻止所有函数执行,您还可以将所有函数从操作中取消挂钩。执行此操作时要小心,因为可能有一些您不知道的函数与您的操作挂钩。

为此,请使用 remove_all_actions() 函数:

remove_all_actions( 'compass_in_footer' );

添加优先级数字作为第二个参数只会删除挂钩到具有您指定的优先级的操作挂钩的函数,这为您提供了更多控制权。

将函数挂钩到过滤器

您还可以选择将函数挂钩到过滤器挂钩。当您想要更改或覆盖某些现有代码时,可以执行此操作。当您创建过滤器挂钩(使用 apply_filters() 函数)时,您可以将其包装在主题或插件中的代码中,然后由附加到挂钩的任何过滤器进行更改。

如果您有想要覆盖默认设置的主题或插件选项,或者您正在创建可能包含被子主题覆盖的元素的父主题,这可能会很有用。

创建过滤器挂钩

apply_filters() 函数具有三个参数:过滤器挂钩的名称、要过滤的值(即默认值)以及随后传递给的可选变量挂钩到过滤器的函数。

您可以在主题模板文件中或通过操作挂钩挂钩的函数内添加过滤器。让我们看一下这两个选项。

返回到我的 compass_colophon() 函数,我将其内容添加到 footer.php 文件中,将其转换为过滤器>apply_filters() 函数如下:

echo apply_filters( 'compass_colophon', '
    <section class="colophon" role="contentinfo">
		<small class="copyright left">
			<?php echo compass_copyright(); ?>
			<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
			<?php bloginfo( 'name' ); ?>
			</a>
		</small><!-- #copyright -->

		<small class="credits right">
				Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>.
			</a>
		</small><!-- #credits -->
	</section><!--#colophon-->'
);

这将输出我设置为 apply_filters() 函数的第二个参数的代码。

但是,我不想将其直接添加到我的主题模板文件中,因此我会将过滤器添加到我已经通过操作挂钩附加的函数中。

因此,我使用 do_action() 函数将 compass_in_footer 操作添加到我的 footer.php 文件中,如上所示,然后我在我的 functions.php 文件中创建一个函数,该函数与该操作挂钩并包含一个过滤器:

if ( ! function_exists( 'compass_colophon' ) ) {
function compass_colophon() {
    echo apply_filters( 'compass_colophon_filter', '
		<section class="colophon" role="contentinfo">
			<small class="copyright left">
				<?php echo compass_copyright(); ?>
				<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
				<?php bloginfo( 'name' ); ?>
				</a>
			</small><!-- #copyright -->
	
			<small class="credits right">
					Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>.
				</a>
			</small><!-- #credits -->
		</section><!--#colophon-->'
	);
}
add_action( 'compass_in_footer', 'compass_colophon' );

这意味着我现在可以通过以下三种方式之一覆盖默认内容:

  • 通过在我的子主题中创建一个名为 compass_colophon() 的新函数,该函数会覆盖我的父主题中的函数,因为它是可插入的
  • 通过从 compass_in_footer 操作挂钩中取消 compass_colophon() 函数,并编写一个新函数并将其附加到其位置
  • 通过创建一个新函数,然后将其挂钩到 compass_colophon_filter 过滤器挂钩,该挂钩会覆盖 apply_filters() 函数中的值

在现实生活中,您不需要有这么多选项,因此您更有可能将过滤器应用于函数中的部分内容,而不是整个内容。

因此我可以创建两个过滤器,一个用于版权部分,另一个用于制作人员:

if ( ! function_exists( 'compass_colophon' ) ) {
function compass_colophon() {
    
	echo '<section class="colophon" role="contentinfo">';
		
		echo apply_filters( 'compass_copyright_filter', '
			<small class="copyright left">
				<?php echo compass_copyright(); ?>
				<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
				<?php bloginfo( 'name' ); ?>
				</a>
			</small><!-- #copyright -->'
		);
		
		echo apply_filters( 'compass_credit_filter', '
			<small class="credits right">
					Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>.
				</a>
			</small><!-- #credits -->'
		);
	echo '</section><!--#colophon-->';
}
add_action( 'compass_in_footer', 'compass_colophon' );

然后我可以通过取消挂钩或在子主题中编写一个新函数来覆盖整个 compass_colophon 函数,或者我可以创建一个挂钩到 compass_copyright_filtercompass_credits_filter 过滤器挂钩,单独覆盖每个元素。

将函数挂钩到过滤器

要将函数挂钩到过滤器挂钩,请使用 add_filter() 函数,该函数有两个参数:挂钩名称和函数名称。

因此,要更改学分,我会编写以下函数:

function new_credits() { ?>
    <small class="credits right">
		Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://rachelmccollin.co.uk">Rachel McCollin</a>.
			</a>
	</small><!-- #credits -->
<?php }
add_filter( 'compass_credits_filter', 'new_credits' );

这会用我的 new_credits() 函数的内容覆盖我原来的 compass_credits_filter 过滤器挂钩中设置的值,但将其他所有内容保留在 compass_colophon() 功能相同。

您还可以在将函数挂钩到过滤器时指定优先级,其方式与操作挂钩完全相同。优先级较低的函数将首先运行。

从过滤器中取消函数

与操作挂钩一样,您也可以从过滤器挂钩中删除函数。您可以使用 remove_filter() 函数来执行此操作,该函数具有三个参数:过滤器挂钩的名称、函数的名称和优先级,如果在函数最初挂钩时设置了优先级,则优先级是强制性的过滤器。

因此,要删除我的 new_credits() 函数,我使用这个:

remove_filter( 'compass_credits_filter', 'new_credits' );

代码输出将恢复为我在原始 apply_filters() 函数中指定的值。因此,如果我想删除 new_credits() 函数并且没有任何内容出现在其位置,我必须添加一个新函数。然后,我取消第一个函数的挂钩并挂钩我的新函数,如下所示:

function no_credits() {
    return;
}
remove_filter( 'compass_credits_filter', 'new_credits' );
add_filter( 'compass_credits_filter', 'no_credits' );

快速回顾

让我们鸟瞰整个事情,以更好地理解它是如何组合在一起的。本教程的主要目标是将内容输出到页脚,并以一种使其他人可以轻松修改页脚内容的方式进行。

最简单的方法是直接调用 footer.php 文件中的函数。然而,这剥夺了函数执行及其输出的一些灵活性。克服这个限制的一种方法是使用钩子,这就是我们接下来所做的。

我们将对 compass_colophon() 函数的调用替换为对 do_action() 的调用。请记住,do_action() 函数没有调用 compass_colophon()。它只是在 do_action() 调用的位置创建了一个操作挂钩。在我们的例子中,操作挂钩的名称是 compass_in_footer

触发 compass_in_footer 操作时我们要调用的实际函数是通过调用 add_action() 函数来指定的。它将我们的钩子名称作为它的第一个参数,我们的回调函数作为第二个参数。我们附加到 compass_in_footer 操作的第一个回调函数是 compass_colophon() 函数。

我们还可以选择将多个回调函数附加到同一个钩子。这正是我们添加 compass_smallprint() 函数作为操作挂钩的另一个回调时所做的事情。调用函数的顺序由传递给 add_action() 的第三个参数的值决定。这使我们能够确保 compass_smallprint() 函数在 compass_colophon() 之后执行。

Satu kelebihan menggunakan cangkuk tindakan ialah apabila tindakan dicetuskan, anda juga boleh menghentikan pelaksanaan mana-mana fungsi panggil balik yang dilampirkan dengan menghantar namanya kepada fungsi remove_action(). remove_action() 函数来停止执行任何附加的回调函数。

此时,我们有一个在页脚中触发的操作钩子,并且我们调用了附加到该操作钩子的不同回调函数。基本上,我们采取了一些操作并输出想要放置在网站页脚中的内容。其他人也可以取消我们的函数的挂钩并将他们自己的回调函数附加到操作挂钩。

如果您只想部分更改页脚的输出,而不完全覆盖或取消原始函数,该怎么办?这就是过滤器被证明有用的时候。

我们使用 apply_filters() 函数创建新的过滤器挂钩。它至少接受两个参数。第一个是过滤器挂钩的名称,我们在两个 apply_filters() 调用中将其设置为 compass_copyright_filtercompass_credit_filter 。第二个参数是我们要过滤或修改的值。我们将其设置为显示版权和信用信息的 HTML 代码。

然后我们可以将我们自己的函数挂接到这些过滤器上。我们在 add_filter() 函数的帮助下完成此操作。该函数接受两个参数。第一个参数是过滤钩子的名称,第二个参数是要用来过滤值的回调函数的名称。

要记住的另一件重要事情是,只有使用 add_filter() 函数附加回调时,传递给 apply_filters() 的值才会被过滤。否则,作为第二个参数传递给 apply_filters() 的值将保持不变。

我们使用此功能来更改片尾字幕,但保持页脚中的版权信息不变。

更多 WordPress 教程

现在您已经知道如何在 WordPress 中添加操作了,也许您想扩展您的编码技能。 WordPress 应用过滤器后,您可以按照我们的教程学习其他技巧:

最终想法

了解操作挂钩和过滤挂钩之间的区别并能够有效地使用它们将促进您的主题和插件开发。事实上,如果不使用至少一种类型的钩子,您根本无法编写插件,因为激活插件中的代码的唯一方法是通过其附加的操作和过滤器钩子。

本指南向您展示了如何使用函数、操作挂钩和一个或多个过滤器挂钩添加相同的功能,以及从挂钩中删除函数的技术以及有关每种技术何时更有用的建议。

除了将函数挂钩到您创建的操作和过滤器挂钩之外,您还可以将它们挂钩到 WordPress 提供的操作和过滤器,例如 wp_head 操作或 body_class

Pada ketika ini, kami mempunyai cangkuk tindakan yang menyala di pengaki, dan kami memanggil fungsi panggil balik berbeza yang dilampirkan pada cangkuk tindakan itu. Pada asasnya, kami mengambil beberapa tindakan dan mengeluarkan kandungan yang ingin kami letakkan di pengaki tapak web kami. Orang lain juga boleh mencabut fungsi kita dan melampirkan fungsi panggil balik mereka sendiri pada cangkuk tindakan. 🎜 🎜Bagaimana jika anda hanya mahu menukar sebahagian output pengaki, tanpa mengatasi atau membatalkan fungsi asal sepenuhnya? Pada masa inilah penapis terbukti berguna. 🎜 🎜Kami menggunakan fungsi apply_filters() untuk membuat cangkuk penapis baharu. Ia menerima sekurang-kurangnya dua parameter. Yang pertama ialah nama cangkuk penapis, yang kami tetapkan kepada compass_copyright_filter dan compass_credit_filter dalam dua panggilan apply_filters(). Parameter kedua ialah nilai yang ingin kita tapis atau ubah suai. Kami menyediakannya untuk memaparkan kod HTML untuk maklumat hak cipta dan kredit. 🎜 🎜Kita kemudian boleh menyambungkan fungsi kita sendiri pada penapis ini. Kami melakukan ini dengan bantuan fungsi add_filter(). Fungsi ini menerima dua parameter. Parameter pertama ialah nama cangkuk penapis, dan parameter kedua ialah nama fungsi panggil balik untuk digunakan untuk menapis nilai. 🎜 🎜Satu lagi perkara penting yang perlu diingat ialah nilai yang dihantar kepada apply_filters() hanya akan ditapis jika anda melampirkan panggilan balik menggunakan fungsi add_filter(). Jika tidak, nilai yang dihantar kepada apply_filters() sebagai argumen kedua akan kekal tidak berubah. 🎜 🎜Kami menggunakan ciri ini untuk menukar kredit tamat tetapi mengekalkan maklumat hak cipta dalam pengaki tetap utuh. 🎜

Lagi tutorial WordPress

🎜Sekarang anda tahu cara menambah tindakan dalam WordPress, mungkin anda ingin mengembangkan kemahiran pengekodan anda. Setelah WordPress menggunakan penapis, anda boleh mengikuti tutorial kami untuk mempelajari helah lain: 🎜

Fikiran Akhir

🎜Memahami perbezaan antara cangkuk aksi dan cangkuk penapis serta dapat menggunakannya dengan berkesan akan memudahkan pembangunan tema dan pemalam anda. Sebenarnya, anda tidak boleh menulis pemalam tanpa menggunakan sekurang-kurangnya satu jenis cangkuk, kerana satu-satunya cara untuk mengaktifkan kod dalam pemalam adalah melalui tindakan yang dilampirkan dan cangkuk penapis. 🎜 🎜Panduan ini menunjukkan kepada anda cara menambah fungsi yang sama menggunakan fungsi, cangkuk tindakan dan satu atau lebih cangkuk penapis, serta teknik untuk mengalih keluar fungsi daripada cangkuk dan nasihat tentang bila setiap teknik lebih berguna. 🎜 🎜Selain mengaitkan fungsi pada tindakan dan cangkuk penapis yang anda buat, anda juga boleh mengaitkannya pada tindakan dan penapis yang disediakan oleh WordPress, seperti tindakan wp_head atau kelas_badan. 🎜

Atas ialah kandungan terperinci Tindakan WordPress lwn Penapis: Ketahui Perbezaannya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn