php 在WordPress中重写插件功能

drkbr07n  于 2022-12-17  发布在  PHP
关注(0)|答案(5)|浏览(141)

我有一个插件安装在我的WordPress站点。
我想覆盖插件中的一个函数。我可以在主题的functions.php中覆盖这个函数吗?如果可以,我该怎么做?
下面是我的插件中的原始函数:

/**
     * sensei_start_course_form function.
     *
     * @access public
     * @param mixed $course_id
     * @return void
     */
    function sensei_start_course_form( $course_id ) {

        $prerequisite_complete = sensei_check_prerequisite_course( $course_id );

        if ( $prerequisite_complete ) {
        ?><form method="POST" action="<?php echo esc_url( get_permalink() ); ?>">

                <input type="hidden" name="<?php echo esc_attr( 'woothemes_sensei_start_course_noonce' ); ?>" id="<?php echo esc_attr( 'woothemes_sensei_start_course_noonce' ); ?>" value="<?php echo esc_attr( wp_create_nonce( 'woothemes_sensei_start_course_noonce' ) ); ?>" />

                <span><input name="course_start" type="submit" class="course-start" value="<?php echo apply_filters( 'sensei_start_course_text', __( 'Start taking this Course', 'woothemes-sensei' ) ); ?>"/></span>

            </form><?php
        } // End If Statement
    } // End sensei_start_course_form()
6tr1vspr

6tr1vspr1#

你不能真的“覆盖”一个函数。如果一个函数被定义了,你就不能重新定义或改变它。你最好的选择是创建一个插件的副本,然后直接改变函数。当然,每次插件更新时你都必须重复这个过程。
给予插件一个不同的名字来区分他们在插件列表中。禁用原来的,启用您的副本。

r8xiu3jd

r8xiu3jd2#

您可以通过使用add_filter()函数来实现。
参见wordpress stackexchange: Override plugin with functions.php
只需在主题的functions.php文件中添加以下代码。

add_filter('sensei_start_course_form','MyCustomfilter',$priority = 10, $args = 1);

function MyCustomfilter($course_id) { 
// Do your logics here
}
oalqel3c

oalqel3c3#

我知道现在说这个有点晚了,但是如果其他人发现了这个帖子。一个简单的解决方案是,如果可以的话,把这个函数复制到你的主题函数文件中,然后重命名它,这样它就不会和原来的函数冲突。然后用你的新函数代替原来的函数。这样你就可以更新插件文件,而不会影响你的修改。

2ledvvac

2ledvvac4#

这件事说得有点晚(2021年11月),但今天还是找到了这个答案,所以我再补充一个身边没看到的解决方案:
由于一些历史原因,WP仍然有能力添加在所有其他插件之前运行的“必须使用”插件。所以这给予了我们添加你想要覆盖的函数的机会,这样当原始插件运行时它就已经存在了。
就你而言
1.在文件夹wp-content/mu-plugins中添加一个.php文件

wp-content/mu-plugins/custom-override.php

1.在custom-override.php中添加函数:

if ( ! function_exists( 'sensei_start_course_form' ) ) {
         function sensei_start_course_form( $course_id ) {
             //your magic here
             //...
         }
    }

1.请确保原始插件也有这个条件“如果函数还不存在...”

if ( ! function_exists( 'sensei_start_course_form' ) ) { ...

这对我起了作用;- )
PD:我不是Maven,如果有什么问题请给予我一些反馈。谢谢
参考:https://wordpress.org/support/article/must-use-plugins/

2eafrhcq

2eafrhcq5#

我还需要修改一个WordPress插件的一些代码。所以我创建了一个函数,可以放在你的child-theme的functions.php中。请在使用前测试!因为我不是PHPMaven,所以它可能写得很差。但这个概念对我很有效。我首先在WordPress之外测试了它,所以一些变量,如$root应该/可以修改。
情况是,我不得不改变一些值在两个不同的文件在插件电子邮件帖子订阅.
我需要更改**$home_url = home_url('/');$home_url = '自定义重定向网址';“含量=“10;'内容=“1;**在文件optin.php和unsubscribe.php中。
每次插件更新后都会运行一个函数。这是我使用的代码:

// Function that replaces the code
function replace_text_plugin_email_posts_to_subscribers($pluginTargetFile, $replaceURL) {

    $root = $_SERVER['DOCUMENT_ROOT']; 

    $replaceThis = array("\$home_url = home_url('/');", "content=\"10;");
    $withThis   = array($replaceURL, "content=\"1;");

    $fname = $root . $pluginTargetFile;
    $fhandle = fopen($fname,"r");
    $content = fread($fhandle,filesize($fname));
    $content = str_replace($replaceThis, $withThis, $content);

    $fhandle = fopen($fname,"w");
    fwrite($fhandle,$content);
    fclose($fhandle);
}

//Function that runs every time that email-posts-to-subscribers is updated

function my_upgrade_function( $upgrader_object, $options ) {

    $current_plugin_path_name = 'email-posts-to-subscribers/email-posts-to-subscribers.php';

    if ($options['action'] == 'update' && $options['type'] == 'plugin' ) {
        foreach($options['plugins'] as $each_plugin) {
            
            if ($each_plugin==$current_plugin_path_name) {
       
                replace_text_plugin_email_posts_to_subscribers("/wp-content/plugins/email-posts-to-subscribers/job/optin.php","\$home_url = 'https://example.com/redirect-optin';");
                replace_text_plugin_email_posts_to_subscribers("/wp-content/plugins/email-posts-to-subscribers/job/unsubscribe.php","\$home_url = 'https://example.com/redirect-unsubscribe';");

            }
        }
    }
}

add_action( 'upgrader_process_complete', 'my_upgrade_function',10, 2);

我想这只会在你需要调整一些小东西的时候有用。重写完整的代码可能不适用于这段代码,但是我没有测试过。

相关问题