将小部件类复制到unctions.php会出现一个空白页面

时间:2017-10-14 作者:Pierre.A

我试图通过从类wp widget recent posts复制整个类来创建自定义的recent posts widget。php到我的主题函数。但是当我这样做的时候,我只会得到一个空白页面。

线以上的一切add_action( \'widgets_init\', \'my_custom_sidebar\' ); 工作正常。

我的新功能。php:

<?php
// Register Custom Navigation Walker
require_once(\'wp_bootstrap_navwalker.php\');

// Bootstrap navigation
function bootstrap_nav()
{
    wp_nav_menu( array(
            \'theme_location\'    => \'header-menu\',
            \'depth\'             => 2,
            \'container\'         => \'false\',
            \'menu_class\'        => \'nav navbar-nav navbar-right\',
            \'fallback_cb\'       => \'wp_bootstrap_navwalker::fallback\',
            \'walker\'            => new wp_bootstrap_navwalker())
    );
}

function twentyseventeen_setup() {
    add_theme_support( \'title-tag\' );
    add_theme_support( \'menus\' );
}

function register_header_menu() {
  register_nav_menu(\'header-menu\',__( \'Header Menu\' ));
}
add_action( \'init\', \'register_header_menu\' );

add_filter( \'show_admin_bar\', \'__return_false\' );

//Register Sidebar
function my_custom_sidebar() {
    register_sidebar(
        array (
            \'name\' => __( \'Custom\', \'your-theme-domain\' ),
            \'id\' => \'custom-side-bar\',
            \'description\' => __( \'Custom Sidebar\', \'your-theme-domain\' ),
            \'before_widget\' => \'<div class="widget-content">\',
            \'after_widget\' => "</div>",
            \'before_title\' => \'<div class="widget-title-box"><h3 class="widget-title">\',
            \'after_title\' => \'</h3></div>\',
        )
    );
}
add_action( \'widgets_init\', \'my_custom_sidebar\' );

class WP_Widget_Recent_Posts extends WP_Widget {

    /**
     * Sets up a new Recent Posts widget instance.
     *
     * @since 2.8.0
     * @access public
     */
    public function __construct() {
        $widget_ops = array(
            \'classname\' => \'widget_recent_entries\',
            \'description\' => __( \'Your site’s most recent Posts.\' ),
            \'customize_selective_refresh\' => true,
        );
        parent::__construct( \'recent-posts\', __( \'Recent Posts\' ), $widget_ops );
        $this->alt_option_name = \'widget_recent_entries\';
    }

    /**
     * Outputs the content for the current Recent Posts widget instance.
     *
     * @since 2.8.0
     * @access public
     *
     * @param array $args     Display arguments including \'before_title\', \'after_title\',
     *                        \'before_widget\', and \'after_widget\'.
     * @param array $instance Settings for the current Recent Posts widget instance.
     */
    public function widget( $args, $instance ) {
        if ( ! isset( $args[\'widget_id\'] ) ) {
            $args[\'widget_id\'] = $this->id;
        }

        $title = ( ! empty( $instance[\'title\'] ) ) ? $instance[\'title\'] : __( \'Recent Posts\' );

        /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
        $title = apply_filters( \'widget_title\', $title, $instance, $this->id_base );

        $number = ( ! empty( $instance[\'number\'] ) ) ? absint( $instance[\'number\'] ) : 5;
        if ( ! $number )
            $number = 5;
        $show_date = isset( $instance[\'show_date\'] ) ? $instance[\'show_date\'] : false;

        /**
         * Filters the arguments for the Recent Posts widget.
         *
         * @since 3.4.0
         *
         * @see WP_Query::get_posts()
         *
         * @param array $args An array of arguments used to retrieve the recent posts.
         */
        $r = new WP_Query( apply_filters( \'widget_posts_args\', array(
            \'posts_per_page\'      => $number,
            \'no_found_rows\'       => true,
            \'post_status\'         => \'publish\',
            \'ignore_sticky_posts\' => true
        ) ) );

        if ($r->have_posts()) :
        ?>
        <?php echo $args[\'before_widget\']; ?>
        <?php if ( $title ) {
            echo $args[\'before_title\'] . $title . $args[\'after_title\'];
        } ?>
        <ul>
        <?php while ( $r->have_posts() ) : $r->the_post(); ?>
            <li>
                <a href="<?php the_permalink(); ?>"><?php get_the_title() ? the_title() : the_ID(); ?></a>
            <?php if ( $show_date ) : ?>
                <span class="post-date"><?php echo get_the_date(); ?></span>
            <?php endif; ?>
            </li>
        <?php endwhile; ?>
        </ul>
        <?php echo $args[\'after_widget\']; ?>
        <?php
        // Reset the global $the_post as this query will have stomped on it
        wp_reset_postdata();

        endif;
    }

    /**
     * Handles updating the settings for the current Recent Posts widget instance.
     *
     * @since 2.8.0
     * @access public
     *
     * @param array $new_instance New settings for this instance as input by the user via
     *                            WP_Widget::form().
     * @param array $old_instance Old settings for this instance.
     * @return array Updated settings to save.
     */
    public function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance[\'title\'] = sanitize_text_field( $new_instance[\'title\'] );
        $instance[\'number\'] = (int) $new_instance[\'number\'];
        $instance[\'show_date\'] = isset( $new_instance[\'show_date\'] ) ? (bool) $new_instance[\'show_date\'] : false;
        return $instance;
    }

    /**
     * Outputs the settings form for the Recent Posts widget.
     *
     * @since 2.8.0
     * @access public
     *
     * @param array $instance Current settings.
     */
    public function form( $instance ) {
        $title     = isset( $instance[\'title\'] ) ? esc_attr( $instance[\'title\'] ) : \'\';
        $number    = isset( $instance[\'number\'] ) ? absint( $instance[\'number\'] ) : 5;
        $show_date = isset( $instance[\'show_date\'] ) ? (bool) $instance[\'show_date\'] : false;
?>
        <p><label for="<?php echo $this->get_field_id( \'title\' ); ?>"><?php _e( \'Title:\' ); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id( \'title\' ); ?>" name="<?php echo $this->get_field_name( \'title\' ); ?>" type="text" value="<?php echo $title; ?>" /></p>

        <p><label for="<?php echo $this->get_field_id( \'number\' ); ?>"><?php _e( \'Number of posts to show:\' ); ?></label>
        <input class="tiny-text" id="<?php echo $this->get_field_id( \'number\' ); ?>" name="<?php echo $this->get_field_name( \'number\' ); ?>" type="number" step="1" min="1" value="<?php echo $number; ?>" size="3" /></p>

        <p><input class="checkbox" type="checkbox"<?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( \'show_date\' ); ?>" name="<?php echo $this->get_field_name( \'show_date\' ); ?>" />
        <label for="<?php echo $this->get_field_id( \'show_date\' ); ?>"><?php _e( \'Display post date?\' ); ?></label></p>
<?php
    }   
}

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

加载中断是因为您复制了同名的类,并且无法两次定义同名的类(它已加载到WordPress core中)。

如果要更改此小部件,应复制它,更改类名,并将其注册为新的小部件。

结束

相关推荐

widgets not working

我粘贴了我的siderbar小部件代码widgets.php 文件 function right_sidebar_widget() { register_sidebar( array( \'name\' => \'Right Siderbar\', \'id\' => \'right-siderbar\', \'description\' => \'Right Sidebar\',