无法在同一行上重新声明函数错误

时间:2019-05-02 作者:Ryszard Jędraszyk

当cart页面加载时,我会遇到此错误(插件设计为仅适用于cart页面):

致命错误:无法重新声明custom\\u cart\\u min\\u qty()(以前在中声明

/home/platne/serwer24774/public_html/staging/wp-content/plugins/my-plugin-slug/my-plugin-slug.php:199) in

/home/platne/serwer24774/public_html/staging/wp-content/plugins/my-plugin-slug/my-plugin-slug.php on line 199
看起来我的代码执行了两次。我如何才能以正确的方式阻止它,而不只是检查函数是否已定义?它是否与我在页面加载时创建新的类实例有关?

我编辑了一些不相关的行和描述,使这段长代码更易于检查,提到的函数现在位于不同的行中。

acau_setting_2 是设置页面复选框值,如果选中,会导致custom_cart_min_qty() 要执行的函数。

<?php

// If this file is called directly, abort.
if ( ! defined( \'WPINC\' ) ) {
    die;
}

// Create settings class.
class my_plugin_name_settings
{   
    private $options;   
    private $settings_page_name;
    private $settings_menu_name;

    public function __construct()
    {               
        $this->settings_page_name = \'my-plugin-slug\';
        $this->settings_menu_name = \'My Plugin Name\';   

        // Initialize and register settings. 
        add_action( \'admin_init\', array( $this, \'register_settings\' ) );
        // Add settings page.
        add_action( \'admin_menu\', array( $this, \'add_settings_page\' ) );
        // Add settings link to plugins page.
        add_action( \'plugin_action_links_\' . plugin_basename( __FILE__ ), array( $this, \'add_settings_link\' ) );
    }

    public function register_settings()
    {   
        register_setting( \'acau_settings\', \'acau_settings\', array( $this, \'sanitize\' ) );

        // ID / title / callback / page
        add_settings_section( \'configuration_section\', __( \'Configuration\', \'my-plugin-slug\' ), array( $this, \'print_section_info\' ), $this->settings_page_name );

        // ID / title / callback / page / section
        add_settings_field( \'acau_setting_1\', __( \'Irrelevant setting with integer value\', \'my-plugin-slug\' ), array( $this, \'acau_setting_1_callback\' ), $this->settings_page_name, \'configuration_section\' );
        add_settings_field( \'acau_setting_2\', __( \'Cart minimum quantity\', \'my-plugin-slug\' ), array( $this, \'acau_setting_2_callback\' ), $this->settings_page_name, \'configuration_section\' );     

    }

    public function add_settings_page()
    {
        // This page will be under "Settings"
        add_options_page(
            \'Settings Admin\', $this->settings_menu_name, \'manage_options\', $this->settings_page_name, array( $this, \'create_settings_page\' )
        );
    }

    /**
     * Get the option that is saved or the default.
     *
     * @param string $index. The option we want to get.
     */
    public function acau_get_settings( $index = false ) {
        $defaults = [ \'acau_setting_1\' => 1000,\'acau_setting_2\' => true ];
        $settings = get_option( \'acau_settings\', $defaults );
        $settings = wp_parse_args( $settings, $defaults );

        if ( $index && isset( $settings[ $index ] ) ) {
            return $settings[ $index ];
        }

        return $settings;
    }

    public function create_settings_page()
    {      
        $this->options = $this->acau_get_settings();        

        ?>
        <div class="wrap">
            <h1>My Plugin Name</h1>
            <form method="post" action="options.php">
            <?php
                // This prints out all hidden setting fields
                settings_fields( \'acau_settings\' );
                do_settings_sections( $this->settings_page_name );
                submit_button();
            ?>
            </form>
        </div>
        <?php
    }

    function add_settings_link( $links ) {
        $links = array_merge( array(
            \'<a href="\' . esc_url( admin_url( \'/options-general.php?page=\' . $this->settings_page_name ) ) . \'">\' . __( \'Settings\' ) . \'</a>\'
        ), $links );
        return $links;
    }

    /**
     * Sanitize each setting field as needed
     *
     * @param array $input Contains all settings fields as array keys
     */
    public function sanitize( $input )
    {
        $new_input = array();
        if( isset( $input[\'acau_setting_1\'] ) )
            $new_input[\'acau_setting_1\'] = absint( $input[\'acau_setting_1\'] );
        if( isset( $input[\'acau_setting_2\'] ) )
            $new_input[\'acau_setting_2\'] = ( $input[\'acau_setting_2\'] == 1 ? 1 : 0 );           

        return $new_input;
    }

    /** 
     * Print the Section text
     */

    public function print_section_info()
    {
        return;
        // print \'Enter your settings below:\';
    }

    /** 
     * Get the settings option array and print one of its values
     */
    public function acau_setting_1_callback()
    {
        printf(
            \'<input type="text" id="acau_setting_1" name="acau_settings[acau_setting_1]" value="%1$s" />
            <p class="description">%2$s</p>\',
            isset( $this->options[\'acau_setting_1\'] ) ? esc_attr( $this->options[\'acau_setting_1\']) : \'\',
            __( \'Irrelevant setting 1 description.\', \'my-plugin-slug\' )
        );
    }

    public function acau_setting_2_callback() {
        printf(
        \'<fieldset>
            <label><input id="acau_setting_2" type="checkbox" name="acau_settings[acau_setting_2]" value="1" %1$s />%2$s</label>
        </fieldset>\',
        isset( $this->options[\'acau_setting_2\'] ) && ( 1 == $this->options[\'acau_setting_2\'] )  ? \'checked="checked" \':\'\',
        __( \'Change minimum product quantity on cart page from 0 to 1.\', \'my-plugin-slug\' )     
        );
    }

}

if( is_admin() )    
    $my_settings_page = new my_plugin_name_settings();

// Only if WooCommerce is active.
if ( in_array( \'woocommerce/woocommerce.php\', apply_filters( \'active_plugins\', get_option( \'active_plugins\' ) ) ) || ( get_site_option(\'active_sitewide_plugins\') && array_key_exists( \'woocommerce/woocommerce.php\', get_site_option(\'active_sitewide_plugins\') ) ) ) {

    // Run plugin.
    add_action( \'template_redirect\', \'run_plugin\' );
    function run_plugin() {

        if (! is_cart() ) return; // Only if it\'s cart page.

        // Enqueue CSS and js file. Localize to use php variables from plugin settings.
        add_action( \'wp_enqueue_scripts\', \'my_plugin_name\' );
        function my_plugin_name( ) {

            $plugin_abbv_name = \'acau\';
            $plugin_slug = \'my-plugin-slug-for-woocommerce\';
            $plugin_short_slug = \'my-plugin-slug\';

            wp_enqueue_style( $plugin_short_slug . \'-style\', plugins_url() . \'/\' . $plugin_slug . \'/css/\' . $plugin_slug . \'.css\');
            wp_enqueue_script( $plugin_short_slug . \'-script\', plugins_url() . \'/\' . $plugin_slug . \'/js/\' . $plugin_slug . \'.js\', \'\', array(\'jquery\'));

            $acau_settings_page = new my_plugin_name_settings();

            // js variable name => variable value
            $data = array (
                \'acau_setting_1\' => $acau_settings_page->acau_get_settings(\'acau_setting_1\'),               
            );      

            wp_localize_script( $plugin_short_slug . \'-script\', \'phpVars\', $data );

            // Cart page minimum qty = 1 instead of 0.              
            if (1 == $acau_settings_page->acau_get_settings(\'acau_setting_2\') ) {               
                add_filter( \'woocommerce_quantity_input_args\', \'custom_cart_min_qty\', 10, 2 );
                function custom_cart_min_qty( $args, $product ) {
                   $args[\'min_value\'] = 1;
                   return $args;
                }
            }       

        }   
    }
}

?>

1 个回复
最合适的回答,由SO网友:MikeNGarrett 整理而成

不要在函数中定义函数。function run_plugin(), function my_plugin_name(), 和custom_cart_min_qty(). 这不是您应该如何编写此代码。你的add_action()add_filter 钩子已经调用了这些函数。

相关推荐