在PHP中覆盖执行的函数

时间:2017-01-16 15:13:34

标签: php wordpress

在某个网站中,直接调用以下函数:

<div class="entry-meta">
    <?php sparkling_posted_on(); ?>

因此定义了函数:

if ( ! function_exists( 'sparkling_posted_on' ) ) :
function sparkling_posted_on() {
$time_string = '<time class="entry-date published" datetime="%1$s">%2$s</time>';
if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) {
    $time_string .= '<time class="updated" datetime="%3$s">%4$s</time>';
}
$time_string = sprintf( $time_string,
    esc_attr( get_the_date( 'c' ) ),
    esc_html( get_the_date() ),
    esc_attr( get_the_modified_date( 'c' ) ),
    esc_html( get_the_modified_date() )
);
printf( '<span class="posted-on"><i class="fa fa-calendar"></i> %1$s</span><span class="byline"> <i class="fa fa-user"></i> %2$s</span>',
    sprintf( '<a href="%1$s" rel="bookmark">%2$s</a>',
        esc_url( get_permalink() ),
        $time_string
    ),
    sprintf( '<span class="author vcard"><a class="url fn n" href="%1$s">%2$s</a></span>',
        esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),
        esc_html( get_the_author() )
    )
); } endif;

如何在不能更改原始代码的情况下阻止该功能运行,或使其无法返回值(即只能添加更多的外部代码)。

我试图使用以下内容,但它没有任何效果:

add_filter('sparkling_posted_on', '__return_false', 100);

注意:这是在WordPress网站上进行的。然而,Wordpress SE建议将这些与一般PHP实践相关的问题发布在SO上。

我的目标是基本上阻止此功能显示博客帖子的元数据(作者/日期),而无法控制主题的原始代码。

2 个答案:

答案 0 :(得分:1)

如您所见,当定义函数时,您有这个条件:

if ( ! function_exists( 'sparkling_posted_on' ) ) :

这基本上表示只有在之前没有定义的情况下它才会定义函数。

所以,基本上,你只需要做

function sparkling_posted_on() {}

在其他地方之前在代码中达到该点,并且您将覆盖该函数(并且不会做任何事情)。

我假设该功能是在主题functions.php中定义的,因此要覆盖而不触及该代码,您有两种可能性:

  • 创建child theme,并覆盖该主题中的函数。 (尽管如此,将应用父主题的更新,这是儿童主题的吸引力的一部分)

  • 创建plugin来定义该功能,因为插件是在主题之前加载的。

两者都不应该做太多工作。插件可能(稍微)更简单。

例如:这是一个可以覆盖函数的最小表达式插件:

<?php
/*
Plugin Name: Sparkling Override
Description: Overrides "sparkling_posted_on()", defined in Such Theme
Version:     XP
*/

if ( ! function_exists( 'sparkling_posted_on' ) ) :
  function sparkling_posted_on() {}
endif;

答案 1 :(得分:-1)

您可能需要使用 remove_action 功能。

<?php
//put this in your theme's functions.php
//returns @bool
remove_action('init', 'sparkling_posted_on');
?>

来源:https://codex.wordpress.org/Function_Reference/remove_action