主页上更多的小部件是否会导致wordpress加载错误?

主页上更多的小部件是否会导致wordpress加载错误?,wordpress,widget,loading,Wordpress,Widget,Loading,我正在使用一个特定的小部件对自己进行编码,并在主页上使用这个小部件近18次来显示不同类别的帖子。是否会导致主页加载错误?!如果我使用普通编码而不是小部件,这是更好还是没有区别?!你可以在我的系统中查看我的网站加载情况,一些朋友的主页加载不好。我想知道主页上有没有更多关于加载的小部件?!你建议用什么来代替小部件?! 这是我在widget中的代码 <?php // Creating the widget class wpb_box extends WP_Widget { function

我正在使用一个特定的小部件对自己进行编码,并在主页上使用这个小部件近18次来显示不同类别的帖子。是否会导致主页加载错误?!如果我使用普通编码而不是小部件,这是更好还是没有区别?!你可以在我的系统中查看我的网站加载情况,一些朋友的主页加载不好。我想知道主页上有没有更多关于加载的小部件?!你建议用什么来代替小部件?! 这是我在widget中的代码

   <?php
// Creating the widget
class wpb_box extends WP_Widget {
function __construct() {
parent::__construct(
// Base ID of your widget
'wpb_box',
// Widget name will appear in UI
__('ابزارک اختصاصی باکس مطالب خبرخوان', 'bigtheme'),
// Widget description
array( 'description' => __( 'ابزارک نمایش باکس مطالب از سایت های مختلف توسط آدرس خوراک یا فید سایت', 'bigtheme' ), )
);
add_action('save_post', array( $this, 'delete_query_caches') );
}
// Creating widget front-end
// This is where the action happens
/**
     * Delete transients
     */
    function delete_query_caches( $post_id ){
        if( !isset( $_POST['post_type'] ) || $_POST['post_type'] !== 'post' ) return;

        $categories = wp_get_post_terms( $post_id, 'category' );

        if( $categories && ! is_WP_Error( $categories ) ) {
            foreach( $categories as $cat ) {
                delete_transient('post'.$cat->term_id.'_query');
            }
        }
    }
public function widget( $args, $instance ) {
        $name = apply_filters( 'widget_title', $instance['name'] );
        $category = apply_filters( 'widget_title', $instance['category'] );
        $id = apply_filters( 'widget_title', $instance['id'] );
$link = apply_filters( 'widget_title', $instance['link'] );
        $display = apply_filters( 'widget_title', $instance['display'] );
        $color = apply_filters( 'widget_title', $instance['color'] );
// This is where you run the code and display the output
?>
<div class="col-sm-6 col-xs-12 padding5">
                <div class="article">
                        <div class="title">     
                            <h3><a href="<?php echo $link ?>" target="_blank"><?php echo $name ?></a></h3>
                            <div class="clear"></div>
                            <div class="line"></div>
                    </div>

                               <?php
if ( false === ( $slider = get_transient( 'post'.$id.'_query' ) ) ) {

     $slider = new WP_Query(array(
            'post_status' =>'publish',
            'post_type' =>'post',
            'cat' =>''.$id.'',
            'posts_per_page' =>'9'      
        ));

    // Make a new query cache for 1 week
    set_transient( 'post'.$id.'_query', $slider, 168 * HOUR_IN_SECONDS );

}
if( !$slider->have_posts() ) return; ?>
<ul>
<?php while( $slider->have_posts() ) : $slider->the_post(); ?>
<li>
<a href="<?php the_permalink() ?>" target="_blank"><?php the_title(); ?></a>
<div style="display:<?php echo $display;?>" class="tooltiptext hidden-xs"><?php the_excerpt(); ?></div>
</li>
<?php endwhile; $slider->rewind_posts(); ?>
</ul>
<?php wp_reset_postdata(); ?>
<div class="list"><a href="<?php echo $link ?>" target="_blank">مشاهده آرشیو کامل</a><a href="<?php echo $link ?>/feed" target="_blank"><img src="<?php bloginfo('template_url'); ?>/images/rss.png" width="18" height="18" alt="خوراک سایت" ></a></div>
            </div>
                </div>
<?php
echo $args['after_widget'];
}
public function form( $instance ) {
        $name   = ( isset( $instance[ 'name' ] ) ) ? $instance[ 'name' ] : '';
        $category   = ( isset( $instance[ 'category' ] ) ) ? $instance[ 'category' ] : '';
$link   = ( isset( $instance[ 'link' ] ) ) ? $instance[ 'link' ] : '';
        $color  = ( isset( $instance[ 'color' ] ) ) ? $instance[ 'color' ] : '';
        $id     = ( isset( $instance[ 'id' ] ) ) ? $instance[ 'id' ] : '';
        $display    = ( isset( $instance[ 'display' ] ) ) ? $instance[ 'display' ] : '';
?>
            <p>
                <label for="<?php echo $this->get_field_id( 'color' ); ?>"><?php _e( 'رنگ باکس مطالب:' ); ?></label>
                <input class="widefat" id="<?php echo $this->get_field_id( 'color' ); ?>" name="<?php echo $this->get_field_name( 'color' ); ?>" type="text" value="<?php echo esc_attr( $color ); ?>" placeholder="مثال : #CCC , #dd3333 , black , blue" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id( 'name' ); ?>"><?php _e( 'عنوان باکس:' ); ?></label>
                <input class="widefat" id="<?php echo $this->get_field_id( 'name' ); ?>" name="<?php echo $this->get_field_name( 'name' ); ?>" type="text" value="<?php echo esc_attr( $name ); ?>" />
            </p>
            <p>
                <label for="<?php echo $this->get_field_id( 'id' ); ?>"><?php _e( 'آی دی دسته بندی' ); ?></label>
                <input class="widefat" id="<?php echo $this->get_field_id( 'id' ); ?>" name="<?php echo $this->get_field_name( 'id' ); ?>" type="text" value="<?php echo esc_attr( $id ); ?>" />
            </p>
            <select id="<?php echo $this->get_field_id('category'); ?>" name="<?php echo $this->get_field_name('category'); ?>" class="widefat" style="width:100%;">
            <?php foreach(get_terms('category','parent=0&hide_empty=0') as $term) { ?>
            <option <?php selected( $instance['category'], $term->term_id ); ?> value="<?php echo $term->term_id; ?>"><?php echo $term->name; ?></option>
            <?php } ?>      
        </select>
<p>
                <label for="<?php echo $this->get_field_id( 'link' ); ?>"><?php _e( 'لینک آرشیو' ); ?></label>
                <input class="widefat" id="<?php echo $this->get_field_id( 'link' ); ?>" name="<?php echo $this->get_field_name( 'link' ); ?>" type="text" value="<?php echo esc_attr( $link ); ?>" />
            </p>

            <p>
                <label><?php _e( 'نمایش توضیحات مطالب' ); ?></label>
                <select class="widefat" id="<?php echo $this->get_field_id( 'display' ); ?>" name="<?php echo $this->get_field_name( 'display' ); ?>">
                    <option <?php selected( $instance['display'], 'block'); ?> value="block">بله</option> 
                    <option <?php selected( $instance['display'], 'none'); ?> value="none">خیر</option> 
                </select>
            </p>

<?php
}
// Updating widget replacing old instances with new
public function update( $new_instance, $old_instance ) {
        $instance = array();
        $instance['name'] = ( ! empty( $new_instance['name'] ) ) ? strip_tags( $new_instance['name'] ) : '';
        $instance['category'] = ( ! empty( $new_instance['category'] ) ) ? strip_tags( $new_instance['category'] ) : '';
$instance['link'] = ( ! empty( $new_instance['link'] ) ) ? strip_tags( $new_instance['link'] ) : '';
        $instance['link2'] = ( ! empty( $new_instance['link2'] ) ) ? strip_tags( $new_instance['link2'] ) : '';
        $instance['id'] = ( ! empty( $new_instance['id'] ) ) ? strip_tags( $new_instance['id'] ) : '';
        $instance['link3'] = ( ! empty( $new_instance['link3'] ) ) ? strip_tags( $new_instance['link3'] ) : '';
        $instance['link4'] = ( ! empty( $new_instance['link4'] ) ) ? strip_tags( $new_instance['link4'] ) : '';
        $instance['link5'] = ( ! empty( $new_instance['link5'] ) ) ? strip_tags( $new_instance['link5'] ) : '';
        $instance['color'] = ( ! empty( $new_instance['color'] ) ) ? strip_tags( $new_instance['color'] ) : '';
        $instance['display'] = ( ! empty( $new_instance['display'] ) ) ? strip_tags( $new_instance['display'] ) : '';
        $instance['source'] = ( ! empty( $new_instance['source'] ) ) ? strip_tags( $new_instance['source'] ) : '';
        $instance['time'] = ( ! empty( $new_instance['time'] ) ) ? strip_tags( $new_instance['time'] ) : '';
        return $instance;
    }
} // Class wpb_box ends here
// Register and load the widget
function wpb_box() {
register_widget( 'wpb_box' );
}
add_action( 'widgets_init', 'wpb_box' );
?>


  • 从代码的角度来看,代码驻留在哪里并不重要。无论是小部件还是模板部件,或者是与某个操作挂钩的插件函数,代码的执行方式都是相同的

    重要的是代码实际在做什么以及如何做(同样,代码在哪里并不重要)

    在您的情况下,我想,小部件会获得一些RSS提要,从而向外部资源发出http请求。这些请求很慢,必须缓存结果以避免在每次加载页面时重复请求。对于小部件的每个实例,可以有不同的过期时间(甚至30秒的差异),以防止它们同时更新。或者更好的是,您应该在后台更新它们,而不要让前端访问者获取这些提要


    您应该使用它来加快速度。

    从代码的角度来看,代码驻留在哪里并不重要。无论是小部件还是模板部件,或者是与某个操作挂钩的插件函数,代码的执行方式都是相同的

    重要的是代码实际在做什么以及如何做(同样,代码在哪里并不重要)

    在您的情况下,我想,小部件会获得一些RSS提要,从而向外部资源发出http请求。这些请求很慢,必须缓存结果以避免在每次加载页面时重复请求。对于小部件的每个实例,可以有不同的过期时间(甚至30秒的差异),以防止它们同时更新。或者更好的是,您应该在后台更新它们,而不要让前端访问者获取这些提要


    是您应该用来加快查询速度的工具。

    如果您使用的查询太多,缓存查询可能会有所帮助。 假设您的自定义小部件如下所示:

    <?php
    /**
     * My widget class
    */
    class dw_myWidget extends WP_Widget {
    
        function __construct() {
            // Instantiate the parent object
            parent::__construct( false, __('My widget') );
    
        }
    
        function widget( $args, $instance ) {
            $title    = apply_filters( 'title', $instance['title'] );
            $link1    = apply_filters( 'category', $instance['category'] ); // category id
    
    
            $portfolio = new WP_Query(array(
                'post_status' =>'publish',
                'post_type' =>'post',
                'cat' =>''.$link1.'',
                'posts_per_page' =>'9'      
            ));
    
    
            // And the rest of the code
        }
    
        function update( $new_instance, $old_instance ) {
            // update stuff
        }
    
        function form( $instance ) {
            // widget form stuff
        }
    }
    
    function dw_MyWidget_register() {
        register_widget( 'dw_myWidget' );
    }
    
    add_action( 'widgets_init', 'dw_MyWidget_register' );
    
    <?php
    /**
     * My widget class
    */
    class dw_myWidget extends WP_Widget {
    
        function __construct() {
            // Instantiate the parent object
            parent::__construct( false, __('My widget') );
    
            add_action('save_post', array( $this, 'delete_query_caches') );
        }
    
        /**
         * Delete transients
         */
        function delete_query_caches( $post_id ){
            if( !isset( $_POST['post_type'] ) || $_POST['post_type'] !== 'post' ) return;
    
            $categories = wp_get_post_terms( $post_id, 'category' );
    
            if( $categories && ! is_WP_Error( $categories ) ) {
                foreach( $categories as $cat ) {
                    delete_transient('post'.$cat->term_id.'_query');
                }
            }
        }
    
        function widget( $args, $instance ) {
            $title    = apply_filters( 'title', $instance['title'] );
            $link1    = apply_filters( 'category', $instance['category'] ); // category id
    
    
            if ( false === ( $portfolio = get_transient( 'post'.$link1.'_query' ) ) ) {
                $portfolio = new WP_Query(array(
                    'post_status' =>'publish',
                    'post_type' =>'post',
                    'cat' =>''.$link1.'',
                    'posts_per_page' =>'9'      
                ));
    
                set_transient( 'post'.$link1.'_query', $portfolio, 168 * HOUR_IN_SECONDS );
            }
    
            // And the rest of the code
        }
    
        function update( $new_instance, $old_instance ) {
            // update stuff
        }
    
        function form( $instance ) {
            // widget form stuff
        }
    }
    
    function dw_MyWidget_register() {
        register_widget( 'dw_myWidget' );
    }
    
    add_action( 'widgets_init', 'dw_MyWidget_register' );
    
    这还不是全部,我们需要在创建新的post时删除瞬态,因此我们在构造函数中注册一个hook到
    save\u post
    操作

    function __construct() {
        // Instantiate the parent object
        parent::__construct( false, __('My widget') );
    
        add_action('save_post', array( $this, 'delete_query_caches') );
    }
    
    /**
     * Delete transients
     */
    function delete_query_caches( $post_id ){
        if( !isset( $_POST['post_type'] ) || $_POST['post_type'] !== 'post' ) return;
    
        $categories = wp_get_post_terms( $post_id, 'category' );
    
        if( $categories && ! is_WP_Error( $categories ) ) {
            foreach( $categories as $cat ) {
                delete_transient('post'.$cat->term_id.'_query');
            }
        }
    } 
    
    最后的代码如下所示:

    <?php
    /**
     * My widget class
    */
    class dw_myWidget extends WP_Widget {
    
        function __construct() {
            // Instantiate the parent object
            parent::__construct( false, __('My widget') );
    
        }
    
        function widget( $args, $instance ) {
            $title    = apply_filters( 'title', $instance['title'] );
            $link1    = apply_filters( 'category', $instance['category'] ); // category id
    
    
            $portfolio = new WP_Query(array(
                'post_status' =>'publish',
                'post_type' =>'post',
                'cat' =>''.$link1.'',
                'posts_per_page' =>'9'      
            ));
    
    
            // And the rest of the code
        }
    
        function update( $new_instance, $old_instance ) {
            // update stuff
        }
    
        function form( $instance ) {
            // widget form stuff
        }
    }
    
    function dw_MyWidget_register() {
        register_widget( 'dw_myWidget' );
    }
    
    add_action( 'widgets_init', 'dw_MyWidget_register' );
    
    <?php
    /**
     * My widget class
    */
    class dw_myWidget extends WP_Widget {
    
        function __construct() {
            // Instantiate the parent object
            parent::__construct( false, __('My widget') );
    
            add_action('save_post', array( $this, 'delete_query_caches') );
        }
    
        /**
         * Delete transients
         */
        function delete_query_caches( $post_id ){
            if( !isset( $_POST['post_type'] ) || $_POST['post_type'] !== 'post' ) return;
    
            $categories = wp_get_post_terms( $post_id, 'category' );
    
            if( $categories && ! is_WP_Error( $categories ) ) {
                foreach( $categories as $cat ) {
                    delete_transient('post'.$cat->term_id.'_query');
                }
            }
        }
    
        function widget( $args, $instance ) {
            $title    = apply_filters( 'title', $instance['title'] );
            $link1    = apply_filters( 'category', $instance['category'] ); // category id
    
    
            if ( false === ( $portfolio = get_transient( 'post'.$link1.'_query' ) ) ) {
                $portfolio = new WP_Query(array(
                    'post_status' =>'publish',
                    'post_type' =>'post',
                    'cat' =>''.$link1.'',
                    'posts_per_page' =>'9'      
                ));
    
                set_transient( 'post'.$link1.'_query', $portfolio, 168 * HOUR_IN_SECONDS );
            }
    
            // And the rest of the code
        }
    
        function update( $new_instance, $old_instance ) {
            // update stuff
        }
    
        function form( $instance ) {
            // widget form stuff
        }
    }
    
    function dw_MyWidget_register() {
        register_widget( 'dw_myWidget' );
    }
    
    add_action( 'widgets_init', 'dw_MyWidget_register' );
    

    如果使用的查询太多,缓存查询可能会有所帮助。
    假设您的自定义小部件如下所示:

    <?php
    /**
     * My widget class
    */
    class dw_myWidget extends WP_Widget {
    
        function __construct() {
            // Instantiate the parent object
            parent::__construct( false, __('My widget') );
    
        }
    
        function widget( $args, $instance ) {
            $title    = apply_filters( 'title', $instance['title'] );
            $link1    = apply_filters( 'category', $instance['category'] ); // category id
    
    
            $portfolio = new WP_Query(array(
                'post_status' =>'publish',
                'post_type' =>'post',
                'cat' =>''.$link1.'',
                'posts_per_page' =>'9'      
            ));
    
    
            // And the rest of the code
        }
    
        function update( $new_instance, $old_instance ) {
            // update stuff
        }
    
        function form( $instance ) {
            // widget form stuff
        }
    }
    
    function dw_MyWidget_register() {
        register_widget( 'dw_myWidget' );
    }
    
    add_action( 'widgets_init', 'dw_MyWidget_register' );
    
    <?php
    /**
     * My widget class
    */
    class dw_myWidget extends WP_Widget {
    
        function __construct() {
            // Instantiate the parent object
            parent::__construct( false, __('My widget') );
    
            add_action('save_post', array( $this, 'delete_query_caches') );
        }
    
        /**
         * Delete transients
         */
        function delete_query_caches( $post_id ){
            if( !isset( $_POST['post_type'] ) || $_POST['post_type'] !== 'post' ) return;
    
            $categories = wp_get_post_terms( $post_id, 'category' );
    
            if( $categories && ! is_WP_Error( $categories ) ) {
                foreach( $categories as $cat ) {
                    delete_transient('post'.$cat->term_id.'_query');
                }
            }
        }
    
        function widget( $args, $instance ) {
            $title    = apply_filters( 'title', $instance['title'] );
            $link1    = apply_filters( 'category', $instance['category'] ); // category id
    
    
            if ( false === ( $portfolio = get_transient( 'post'.$link1.'_query' ) ) ) {
                $portfolio = new WP_Query(array(
                    'post_status' =>'publish',
                    'post_type' =>'post',
                    'cat' =>''.$link1.'',
                    'posts_per_page' =>'9'      
                ));
    
                set_transient( 'post'.$link1.'_query', $portfolio, 168 * HOUR_IN_SECONDS );
            }
    
            // And the rest of the code
        }
    
        function update( $new_instance, $old_instance ) {
            // update stuff
        }
    
        function form( $instance ) {
            // widget form stuff
        }
    }
    
    function dw_MyWidget_register() {
        register_widget( 'dw_myWidget' );
    }
    
    add_action( 'widgets_init', 'dw_MyWidget_register' );
    
    这还不是全部,我们需要在创建新的post时删除瞬态,因此我们在构造函数中注册一个hook到
    save\u post
    操作

    function __construct() {
        // Instantiate the parent object
        parent::__construct( false, __('My widget') );
    
        add_action('save_post', array( $this, 'delete_query_caches') );
    }
    
    /**
     * Delete transients
     */
    function delete_query_caches( $post_id ){
        if( !isset( $_POST['post_type'] ) || $_POST['post_type'] !== 'post' ) return;
    
        $categories = wp_get_post_terms( $post_id, 'category' );
    
        if( $categories && ! is_WP_Error( $categories ) ) {
            foreach( $categories as $cat ) {
                delete_transient('post'.$cat->term_id.'_query');
            }
        }
    } 
    
    最后的代码如下所示:

    <?php
    /**
     * My widget class
    */
    class dw_myWidget extends WP_Widget {
    
        function __construct() {
            // Instantiate the parent object
            parent::__construct( false, __('My widget') );
    
        }
    
        function widget( $args, $instance ) {
            $title    = apply_filters( 'title', $instance['title'] );
            $link1    = apply_filters( 'category', $instance['category'] ); // category id
    
    
            $portfolio = new WP_Query(array(
                'post_status' =>'publish',
                'post_type' =>'post',
                'cat' =>''.$link1.'',
                'posts_per_page' =>'9'      
            ));
    
    
            // And the rest of the code
        }
    
        function update( $new_instance, $old_instance ) {
            // update stuff
        }
    
        function form( $instance ) {
            // widget form stuff
        }
    }
    
    function dw_MyWidget_register() {
        register_widget( 'dw_myWidget' );
    }
    
    add_action( 'widgets_init', 'dw_MyWidget_register' );
    
    <?php
    /**
     * My widget class
    */
    class dw_myWidget extends WP_Widget {
    
        function __construct() {
            // Instantiate the parent object
            parent::__construct( false, __('My widget') );
    
            add_action('save_post', array( $this, 'delete_query_caches') );
        }
    
        /**
         * Delete transients
         */
        function delete_query_caches( $post_id ){
            if( !isset( $_POST['post_type'] ) || $_POST['post_type'] !== 'post' ) return;
    
            $categories = wp_get_post_terms( $post_id, 'category' );
    
            if( $categories && ! is_WP_Error( $categories ) ) {
                foreach( $categories as $cat ) {
                    delete_transient('post'.$cat->term_id.'_query');
                }
            }
        }
    
        function widget( $args, $instance ) {
            $title    = apply_filters( 'title', $instance['title'] );
            $link1    = apply_filters( 'category', $instance['category'] ); // category id
    
    
            if ( false === ( $portfolio = get_transient( 'post'.$link1.'_query' ) ) ) {
                $portfolio = new WP_Query(array(
                    'post_status' =>'publish',
                    'post_type' =>'post',
                    'cat' =>''.$link1.'',
                    'posts_per_page' =>'9'      
                ));
    
                set_transient( 'post'.$link1.'_query', $portfolio, 168 * HOUR_IN_SECONDS );
            }
    
            // And the rest of the code
        }
    
        function update( $new_instance, $old_instance ) {
            // update stuff
        }
    
        function form( $instance ) {
            // widget form stuff
        }
    }
    
    function dw_MyWidget_register() {
        register_widget( 'dw_myWidget' );
    }
    
    add_action( 'widgets_init', 'dw_MyWidget_register' );
    


    与redimate stuf相比,自定义代码总是更好。因此,您建议编写自定义代码而不是小部件。在这种情况下,我只需将小部件中的代码准确地写入主页。这样更好吗?!没有必要使用你可以创建的小部件。你可以为你的主页创建自定义模板,然后创建代码挂钩,你可以将其中一个用作小部件。是的,我建议你使用代码而不是小部件,小部件是为那些不太懂代码的用户准备的。如果你很了解代码,那就继续吧。好的,谢谢。是的,我知道代码,但我使用widget是因为简单:)那么widget对web加载的影响是不是?!正确你可以使用一个或两个BTW,如果更多,它将使你的网站沉重,加载速度将下降。自定义代码总是比重播stuf更好。所以你建议编写自定义代码而不是小部件。在这种情况下,我只需将小部件中的确切代码写入主页。这样更好吗?!没有必要使用你可以创建的小部件。你可以为你的主页创建自定义模板,然后创建代码挂钩,你可以将其中一个用作小部件。是的,我建议你使用代码而不是小部件,小部件是为那些不太懂代码的用户准备的。如果你很了解代码,那就继续吧。好的,谢谢。是的,我知道代码,但我使用widget是因为简单:)那么widget对web加载的影响是不是?!正确,你可以使用一个或两个BTW,如果更多,它将使你的网站沉重,加载速度将下降。谢谢你的回答。没有小部件不获取提要,只显示特定类别的帖子。获取帖子由wp_自动插件完成。帖子保存在我们的数据库中,并显示在我的数据库中,而不是外部数据库中。但对于缓存主页我需要帮助来解决这个问题:)我正在为缓存网站使用wp rocket插件。你认为是24小时缓存还是无限时间缓存(需要时才缓存)?!!如何在主页上使用瞬态API?!我编辑了主要问题,你们可以看到我在小部件中为每个特定类别帖子使用的代码谢谢你们的回答。没有小部件不获取提要,只显示特定类别的帖子。获取帖子由wp_自动插件完成。帖子保存在我们的数据库中,并从我的数据库显示在网站中,而不是外部数据库。但对于缓存主页我需要帮助来解决这个问题:)我正在为缓存网站使用wp rocket插件。你认为是24小时缓存还是无限时间缓存(需要时才缓存)?!!如何在主页上使用瞬态API?!我编辑了主要问题,您可以看到我在小部件中为每个特定类别帖子使用的代码。删除缓存中有问题。当新帖子发布时,小部件将不会更新!!!!删除缓存中有问题。当新帖子发布时,小部件将不会更新!!!!