WordPress 작업과 필터: 차이점을 알아보세요

WBOY
풀어 주다: 2023-08-31 16:25:07
원래의
1395명이 탐색했습니다.

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

  • 기능
  • 액션 훅
  • 필터 후크
  • 직접 기능 호출
  • 기능을 액션으로 연결
  • 필터에 대한 후크 기능

액션 및 필터 후크는 다양한 WordPress API의 필수 부분입니다. 그것들이 없으면 테마 및 (특히) 플러그인의 기능이 제한됩니다.

그러나 때로는 두 가지를 혼동하기 쉽습니다. 특히 WordPress에 동일한 이름의 액션 후크와 필터 후크가 모두 있는 경우에는 더욱 그렇습니다.

이 글에서는 액션 후크와 필터 후크를 정의하고 차이점을 설명하며, 테마와 플러그인에서 이를 사용하는 방법을 보여드리겠습니다. 또한 언제 사용할 수 있는지에 대한 몇 가지 예도 제시하겠습니다.

WordPress의 코드에 작업 및 필터 후크를 추가하거나 이에 함수를 연결하는 경우 WordPress에서 작업 및 필터를 호출하는 방식과 발생 순서를 이해하는 데 도움이 됩니다. 작업을 수행하는 또 다른 튜토리얼이 있으므로 여기서는 이에 대해 자세히 설명하지 않겠습니다.

정의와 차이점

몇 가지 정의부터 시작해 보겠습니다. 또한 액션과 필터 후크 및 함수를 정의하여 이들 간의 차이점을 확인할 것입니다.

기능

함수는 대부분의 사람들이 WordPress 개발을 배울 때 가장 먼저 접하게 되는 것입니다. 테마의 functions.php 파일에 코드를 추가했다면 함수를 작성하게 될 것입니다.

함수는 상황이 어떻게 발생하는지 지정합니다. 데이터를 쿼리하고, 콘텐츠를 출력하거나, 기타 여러 작업을 수행하는 함수를 작성합니다. 테마의 템플릿 파일에서 직접 함수를 호출(실행)하거나 액션 또는 필터 후크에 연결할 수 있습니다. 함수에는 함수를 적용해야 하는 시기를 지정하는 템플릿 태그(예: 조건부 태그)도 포함될 수 있습니다.

이 문서의 뒷부분에서 함수를 실행하는 다양한 방법을 보여 드리겠습니다.

액션 훅

페이지 로딩, 사용자 로그인, 테마나 플러그인에 정의한 사용자 정의 작업 등 어떤 일이 발생하면 작업 후크(또는 작업)가 트리거됩니다.

곧 시연할 do_action() 기능을 사용하여 자신만의 액션 후크를 추가할 수 있습니다. 이 작업에 연결하는 모든 기능은 코드의 해당 지점에서 실행됩니다.

필터 후크

필터 후크 또는 필터는 어떤 일이 발생하는 방식을 제어하거나 이미 출력된 내용을 변경합니다. 필터를 사용하여 메타데이터를 특정 형식으로 출력하거나, 플러그인의 텍스트 출력을 재정의하거나, 특정 콘텐츠가 완전히 표시되지 않도록 할 수 있습니다.

곧 설명할 apply_filters() 함수를 사용하여 코드에 필터를 추가할 수 있습니다. "적용"이라는 단어에서 알 수 있듯이 기존 코드에 필터를 적용하는 반면, apply_filters() 函数在代码中添加过滤器,我将很快演示该函数。正如单词“apply”所示,您将过滤器应用于现有代码,而使用 do_action()로 만든 작업은 함수를 연결할 때까지 비어 있습니다.

함수, 연산, 필터 사용하기

함수, 연산, 필터를 사용하는 방법을 보여주는 몇 가지 예를 살펴보겠습니다. 먼저 함수를 후크에 연결하지 않고 코드에서 직접 사용하는 방법을 살펴보겠습니다.

직접 기능 호출

아래는 템플릿 파일에서 직접 호출하는 함수의 예입니다. 내 클라이언트 사이트에서 바닥글에 저작권 정보가 포함된 저작권 페이지를 추가했습니다. 기능은 다음과 같습니다:

으아악

이 함수는 상위 테마에서 사용하기 때문에 연결 가능합니다. 그런 다음 하위 테마에서 동일한 이름으로 새 함수를 생성하면 해당 함수를 덮어쓰게 됩니다. 이 함수에는 코드에서 직접 호출되는 또 다른 함수 compass_colophon()도 포함되어 있습니다.

이 기능은 상위 테마의 functions.php 文件中。我可以直接在我的主题的 footer.php 파일에 다음과 같이 호출됩니다.

으아악

내 테마에서 호출된 위치에 함수의 코드가 출력됩니다. 함수에 인수를 전달한 다음 해당 인수를 함수 내에서 사용할 수도 있습니다.

나중에 설명하겠지만 이 기능은 액션이나 필터에 연결될 수도 있습니다.

기능을 액션으로 연결

저작권 페이지 기능을 직접 호출하는 것보다 후크에 연결하면 더 유연해질 것입니다.

创建操作挂钩

我可以在 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</strong> 文件中,将其转换为过滤器>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() 之后执行。

액션 후크를 사용하면 액션이 트리거될 때 이름을 remove_action() 함수에 전달하여 연결된 콜백 함수의 실행을 중지할 수도 있다는 장점이 있습니다.

이 시점에서 바닥글에서 실행되는 액션 후크가 있고 해당 액션 후크에 연결된 다양한 콜백 함수를 호출합니다. 기본적으로 우리는 몇 가지 조치를 취하고 웹 사이트 바닥글에 배치하려는 콘텐츠를 출력합니다. 다른 사람들도 우리 함수를 해제하고 자신의 콜백 함수를 액션 후크에 연결할 수 있습니다.

원래 기능을 완전히 무시하거나 취소하지 않고 바닥글 출력을 부분적으로만 변경하고 싶다면 어떻게 해야 하나요? 필터가 유용할 때입니다.

우리는 apply_filters() 函数创建新的过滤器挂钩。它至少接受两个参数。第一个是过滤器挂钩的名称,我们在两个 apply_filters() 调用中将其设置为 compass_copyright_filtercompass_credit_filter를 사용합니다. 두 번째 매개변수는 필터링하거나 수정하려는 값입니다. 저작권 및 신용 정보에 대한 HTML 코드를 표시하도록 설정했습니다.

그런 다음 자체 기능을 이러한 필터에 연결할 수 있습니다. 우리는 add_filter() 함수의 도움으로 이를 수행합니다. 이 함수는 두 개의 매개변수를 허용합니다. 첫 번째 매개변수는 필터 후크의 이름이고, 두 번째 매개변수는 값을 필터링하는 데 사용할 콜백 함수의 이름입니다.

기억해야 할 또 다른 중요한 점은 add_filter() 函数附加回调时,传递给 apply_filters() 的值才会被过滤。否则,作为第二个参数传递给 apply_filters() 함수를 사용하여 콜백을 첨부하는 경우에만 apply_filters()에 전달된 값이 필터링된다는 것입니다. 그렇지 않으면 두 번째 인수로 apply_filters()에 전달된 값은 변경되지 않고 그대로 유지됩니다.

이 기능을 사용하여 엔딩 크레딧을 변경하면서도 바닥글의 저작권 정보는 그대로 유지합니다.

더 많은 WordPress 튜토리얼

이제 WordPress에 작업을 추가하는 방법을 알았으니 코딩 기술을 확장하고 싶을 수도 있습니다. WordPress에 필터가 적용되면 튜토리얼에 따라 다른 요령을 배울 수 있습니다.

최종 생각

액션 후크와 필터 후크의 차이점을 이해하고 효과적으로 사용할 수 있으면 테마 및 플러그인 개발이 쉬워집니다. 실제로 플러그인에서 코드를 활성화하는 유일한 방법은 연결된 작업 및 필터 후크를 통해서이기 때문에 최소한 한 가지 유형의 후크를 사용하지 않고는 플러그인을 작성할 수 없습니다.

이 가이드에서는 함수, 액션 후크 및 하나 이상의 필터 후크를 사용하여 동일한 기능을 추가하는 방법과 후크에서 기능을 제거하는 기술 및 각 기술이 더 유용한 경우에 대한 조언을 보여줍니다.

생성한 액션 및 필터 후크에 함수를 연결하는 것 외에도 wp_head 操作或 body_class 필터와 같이 WordPress에서 제공하는 액션 및 필터에 함수를 연결할 수도 있습니다.

위 내용은 WordPress 작업과 필터: 차이점을 알아보세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿