【问题标题】:Issues with PHP classes and WordPressPHP 类和 WordPress 的问题
【发布时间】:2016-07-13 14:57:19
【问题描述】:

我目前正在尝试向Rename wp-login.php 添加新选项,因为它几乎没有更新。所有者还允许我为其添加新选项。

插件功能允许您“重命名”/wp-admin/ 和 wp-login.php 到不同的位置。我对 PHP 类几乎一无所知,你猜对了,整个插件基本上是使用 PHP 类创建的。

我想做什么:

  1. 当该字段为空时,将所有内容还原为 /wp-admin/。基本上是一个禁用选项;我知道了,但是当该字段留空并且您将其保存时,它会保存之前输入的值。这是个问题;保存为空时应该为空。

  2. 目前该字段位于设置菜单的“永久链接”部分,但我想将该选项放在自定义页面中。

另外,这个插件如何保存字段的值?我找不到任何东西,甚至没有 register_setting 函数。

当我说“领域”时,我指的是这个领域:<input id="rwl-page-input" type="text" name="rwl_page" value="' . $this->new_login_slug() . '">


代码如下:

<?php
if ( defined( 'ABSPATH' ) && ! class_exists( 'Rename_WP_Login' ) ) {

    class Rename_WP_Login {
        private $wp_login_php;

        private function basename() {
            return plugin_basename( __FILE__ );
        }

        private function path() {
            return trailingslashit( dirname( __FILE__ ) );
        }

        private function use_trailing_slashes() {
            return '/' === substr( get_option( 'permalink_structure' ), -1, 1 );
        }

        private function user_trailingslashit( $string ) {
            return $this->use_trailing_slashes() ? trailingslashit( $string ) : untrailingslashit( $string );
        }

        private function wp_template_loader() {
            global $pagenow;

            $pagenow = 'index.php';

            if ( ! defined( 'WP_USE_THEMES' ) ) {
                define( 'WP_USE_THEMES', true );
            }

            wp();

            if ( $_SERVER['REQUEST_URI'] === $this->user_trailingslashit( str_repeat( '-/', 10 ) ) ) {
                $_SERVER['REQUEST_URI'] = $this->user_trailingslashit( '/wp-login-php/' );
            }

            require_once ABSPATH . WPINC . '/template-loader.php';

            die;
        }

        private function new_login_slug() {
            if (
                ( $slug = get_option( 'rwl_page' ) ) || (
                    is_multisite() &&
                    is_plugin_active_for_network( $this->basename() ) &&
                    ( $slug = get_site_option( 'rwl_page', 'login' ) )
                ) ||
                ( $slug = 'login' )
            ) {
                return $slug;
            }
        }

        public function new_login_url( $scheme = null ) {
            if ( get_option( 'permalink_structure' ) ) {
                return $this->user_trailingslashit( home_url( '/', $scheme ) . $this->new_login_slug() );
            } else {
                return home_url( '/', $scheme ) . '?' . $this->new_login_slug();
            }
        }

        public function __construct() {
            register_activation_hook( $this->basename(), array( $this, 'activate' ) );
            register_uninstall_hook( $this->basename(), array( 'Rename_WP_Login', 'uninstall' ) );

            add_action( 'admin_init', array( $this, 'admin_init' ) );
            add_action( 'admin_notices', array( $this, 'admin_notices' ) );
            add_action( 'network_admin_notices', array( $this, 'admin_notices' ) );

            if ( is_multisite() && ! function_exists( 'is_plugin_active_for_network' ) ) {
                require_once ABSPATH . '/wp-admin/includes/plugin.php';
            }

            add_filter( 'plugin_action_links_' . $this->basename(), array( $this, 'plugin_action_links' ) );

            if ( is_multisite() && is_plugin_active_for_network( $this->basename() ) ) {
                add_filter( 'network_admin_plugin_action_links_' . $this->basename(), array( $this, 'plugin_action_links' ) );

                add_action( 'wpmu_options', array( $this, 'wpmu_options' ) );
                add_action( 'update_wpmu_options', array( $this, 'update_wpmu_options' ) );
            }

            add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ), 1 );
            add_action( 'wp_loaded', array( $this, 'wp_loaded' ) );

            add_filter( 'site_url', array( $this, 'site_url' ), 10, 4 );
            add_filter( 'network_site_url', array( $this, 'network_site_url' ), 10, 3 );
            add_filter( 'wp_redirect', array( $this, 'wp_redirect' ), 10, 2 );

            add_filter( 'site_option_welcome_email', array( $this, 'welcome_email' ) );

            remove_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );
        }

        public function activate() {
            add_option( 'rwl_redirect', '1' );
        }

        public static function uninstall() {
            global $wpdb;

            if ( is_multisite() ) {
                $blogs = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );

                if ( $blogs ) {
                    foreach ( $blogs as $blog ) {
                        switch_to_blog( $blog );
                        delete_option( 'rwl_page' );
                    }

                    restore_current_blog();
                }

                delete_site_option( 'rwl_page' );
            } else {
                delete_option( 'rwl_page' );
            }
        }

        public function wpmu_options() {
            echo (
                '<h3>' .
                    _x( 'Rename wp-login.php', 'Text string for settings page', 'rename-wp-login' ) .
                '</h3>' .
                '<p>' .
                    __( 'This option allows you to set a networkwide default, which can be overridden by individual sites. Simply go to to the site’s permalink settings to change the url.', 'rename-wp-login' ) .
                '</p>' .
                '<table class="form-table">' .
                    '<tr valign="top">' .
                        '<th scope="row">' .
                            __( 'Networkwide default', 'rename-wp-login' ) .
                        '</th>' .
                        '<td>' .
                            '<input id="rwl-page-input" type="text" name="rwl_page" value="' . get_site_option( 'rwl_page', 'login' )  . '">' .
                        '</td>' .
                    '</tr>' .
                '</table>'
            );
        }

        public function update_wpmu_options() {
            if (
                ( $rwl_page = sanitize_title_with_dashes( $_POST['rwl_page'] ) ) &&
                strpos( $rwl_page, 'wp-login' ) === false &&
                ! in_array( $rwl_page, $this->forbidden_slugs() )
            ) {
                update_site_option( 'rwl_page', $rwl_page );
            }
        }

        public function admin_init() {
            global $pagenow;

            add_settings_section(
                'rename-wp-login-section',
                _x( 'Rename wp-login.php', 'Text string for settings page', 'rename-wp-login' ),
                array( $this, 'rwl_section_desc' ),
                'permalink'
            );

            add_settings_field(
                'rwl-page',
                '<label for="rwl-page">' . __( 'Login url', 'rename-wp-login' ) . '</label>',
                array( $this, 'rwl_page_input' ),
                'permalink',
                'rename-wp-login-section'
            );

            if ( isset( $_POST['rwl_page'] ) && $pagenow === 'options-permalink.php' ) {
                if (
                    ( $rwl_page = sanitize_title_with_dashes( $_POST['rwl_page'] ) ) &&
                    strpos( $rwl_page, 'wp-login' ) === false &&
                    ! in_array( $rwl_page, $this->forbidden_slugs() )
                ) {
                    if ( is_multisite() && $rwl_page === get_site_option( 'rwl_page', 'login' ) ) {
                        delete_option( 'rwl_page' );
                    } else {
                        update_option( 'rwl_page', $rwl_page );
                    }
                }
            }

            if ( get_option( 'rwl_redirect' ) ) {
                delete_option( 'rwl_redirect' );

                if ( is_multisite() && is_super_admin() && is_plugin_active_for_network( $this->basename() ) ) {
                    $redirect = network_admin_url( 'settings.php#rwl-page-input' );
                } else {
                    $redirect = admin_url( 'options-permalink.php#rwl-page-input' );
                }

                wp_safe_redirect( $redirect );

                die;
            }
        }

        public function rwl_section_desc() {
            if ( is_multisite() && is_super_admin() && is_plugin_active_for_network( $this->basename() ) ) {
                echo (
                    '<p>' .
                        sprintf(
                            __( 'To set a networkwide default, go to %s.', 'rename-wp-login' ),
                            '<a href="' . esc_url( network_admin_url( 'settings.php#rwl-page-input' ) ) . '">' .
                                __( 'Network Settings', 'rename-wp-login' ) .
                            '</a>'
                        ) .
                    '</p>'
                );
            }
        }

        public function rwl_page_input() {
            if ( get_option( 'permalink_structure' ) ) {
                echo '<code>' . trailingslashit( home_url() ) . '</code> <input id="rwl-page-input" type="text" name="rwl_page" value="' . $this->new_login_slug()  . '">' . ( $this->use_trailing_slashes() ? ' <code>/</code>' : '' );
            } else {
                echo '<code>' . trailingslashit( home_url() ) . '?</code> <input id="rwl-page-input" type="text" name="rwl_page" value="' . $this->new_login_slug()  . '">';
            }
        }

        public function admin_notices() {
            global $pagenow;

            if ( ! is_network_admin() && $pagenow === 'options-permalink.php' && isset( $_GET['settings-updated'] ) ) {
                echo '<div class="notice notice-success is-dismissible"><p>' . sprintf( __( 'Your login page is now here: %s. Bookmark this page!', 'rename-wp-login' ), '<strong><a href="' . $this->new_login_url() . '">' . $this->new_login_url() . '</a></strong>' ) . '</p></div>';
            }
        }

        public function plugin_action_links( $links ) {
            if ( is_network_admin() && is_plugin_active_for_network( $this->basename() ) ) {
                array_unshift( $links,
                    '<a href="' . esc_url( network_admin_url( 'settings.php#rwl-page-input' ) ) . '">' .
                        __( 'Settings', 'rename-wp-login' ) .
                    '</a>'
                );
            } elseif ( ! is_network_admin() ) {
                array_unshift( $links,
                    '<a href="' . esc_url( admin_url( 'options-permalink.php#rwl-page-input' ) ) . '">' .
                        __( 'Settings', 'rename-wp-login' ) .
                    '</a>'
                );
            }

            return $links;
        }

        public function plugins_loaded() {
            global $pagenow;

            load_plugin_textdomain( 'rename-wp-login' );

            if (
                ! is_multisite() && (
                    strpos( $_SERVER['REQUEST_URI'], 'wp-signup' ) !== false ||
                    strpos( $_SERVER['REQUEST_URI'], 'wp-activate' ) !== false
                )
            ) {
                wp_die( __( 'This feature is not enabled.', 'rename-wp-login' ), '', array( 'response' => 403 ) );
            }

            $request = parse_url( $_SERVER['REQUEST_URI'] );

            if ( (
                    strpos( $_SERVER['REQUEST_URI'], 'wp-login.php' ) !== false ||
                    untrailingslashit( $request['path'] ) === site_url( 'wp-login', 'relative' )
                ) &&
                ! is_admin()
            ) {
                $this->wp_login_php = true;
                $_SERVER['REQUEST_URI'] = $this->user_trailingslashit( '/' . str_repeat( '-/', 10 ) );
                $pagenow = 'index.php';
            } elseif (
                untrailingslashit( $request['path'] ) === home_url( $this->new_login_slug(), 'relative' ) || (
                    ! get_option( 'permalink_structure' ) &&
                    isset( $_GET[$this->new_login_slug()] ) &&
                    empty( $_GET[$this->new_login_slug()] )
            ) ) {
                $pagenow = 'wp-login.php';
            }
        }

        public function wp_loaded() {
            global $pagenow;

            if ( is_admin() && ! is_user_logged_in() && ! defined( 'DOING_AJAX' ) ) {
                wp_die( __( 'You must log in to access the admin area.', 'rename-wp-login' ), '', array( 'response' => 403 ) );
            }

            $request = parse_url( $_SERVER['REQUEST_URI'] );

            if (
                $pagenow === 'wp-login.php' &&
                $request['path'] !== $this->user_trailingslashit( $request['path'] ) &&
                get_option( 'permalink_structure' )
            ) {
                wp_safe_redirect( $this->user_trailingslashit( $this->new_login_url() ) . ( ! empty( $_SERVER['QUERY_STRING'] ) ? '?' . $_SERVER['QUERY_STRING'] : '' ) );
                die;
            } elseif ( $this->wp_login_php ) {
                if (
                    ( $referer = wp_get_referer() ) &&
                    strpos( $referer, 'wp-activate.php' ) !== false &&
                    ( $referer = parse_url( $referer ) ) &&
                    ! empty( $referer['query'] )
                ) {
                    parse_str( $referer['query'], $referer );

                    if (
                        ! empty( $referer['key'] ) &&
                        ( $result = wpmu_activate_signup( $referer['key'] ) ) &&
                        is_wp_error( $result ) && (
                            $result->get_error_code() === 'already_active' ||
                            $result->get_error_code() === 'blog_taken'
                    ) ) {
                        wp_safe_redirect( $this->new_login_url() . ( ! empty( $_SERVER['QUERY_STRING'] ) ? '?' . $_SERVER['QUERY_STRING'] : '' ) );
                        die;
                    }
                }

                $this->wp_template_loader();
            } elseif ( $pagenow === 'wp-login.php' ) {
                global $error, $interim_login, $action, $user_login;

                @require_once ABSPATH . 'wp-login.php';

                die;
            }
        }

        public function site_url( $url, $path, $scheme, $blog_id ) {
            return $this->filter_wp_login_php( $url, $scheme );
        }

        public function network_site_url( $url, $path, $scheme ) {
            return $this->filter_wp_login_php( $url, $scheme );
        }

        public function wp_redirect( $location, $status ) {
            return $this->filter_wp_login_php( $location );
        }

        public function filter_wp_login_php( $url, $scheme = null ) {
            if ( strpos( $url, 'wp-login.php' ) !== false ) {
                if ( is_ssl() ) {
                    $scheme = 'https';
                }

                $args = explode( '?', $url );

                if ( isset( $args[1] ) ) {
                    parse_str( $args[1], $args );
                    $url = add_query_arg( $args, $this->new_login_url( $scheme ) );
                } else {
                    $url = $this->new_login_url( $scheme );
                }
            }

            return $url;
        }

        public function welcome_email( $value ) {
            return str_replace( 'wp-login.php', trailingslashit( get_site_option( 'rwl_page', 'login' ) ), $value );
        }

        public function forbidden_slugs() {
            $wp = new WP;
            return array_merge( $wp->public_query_vars, $wp->private_query_vars );
        }
    }

    new Rename_WP_Login;
}

如果有人能帮我解决这个问题,我会非常非常感激!

【问题讨论】:

    标签: php wordpress class plugins


    【解决方案1】:

    第一个

    另外,这个插件如何保存字段的值?我找不到任何东西,甚至没有 register_setting 函数。

    这个插件通过这个函数保存值:

    public function update_wpmu_options() {
        if (
            ( $rwl_page = sanitize_title_with_dashes( $_POST['rwl_page'] ) ) &&
        strpos( $rwl_page, 'wp-login' ) === false &&
            ! in_array( $rwl_page, $this->forbidden_slugs() )
        ) {
            update_site_option( 'rwl_page', $rwl_page );
        }
    }
    

    您可以阅读更多内容:update_site_option

    在admin_init函数中有

    add_settings_field(
        'rwl-page',
        '<label for="rwl-page">' . __( 'Login url', 'rename-wp-login' ) . '</label>',
        array( $this, 'rwl_page_input' ),
        'permalink',
        'rename-wp-login-section'
    );
    

    此函数将保存值。如果您让该字段为空,则不会更新此值。这就是为什么你有它的旧价值。 如果你想全部恢复到旧版本,你可以删除这个插件。

    希望对您有所帮助。 我只是编码器尝试过这个插件而不是开发它。 xD

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2017-03-22
      • 2011-02-21
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      相关资源
      最近更新 更多