Php Wordpress帖子-Ajax加载更多随机顺序,过滤器不工作?

Php Wordpress帖子-Ajax加载更多随机顺序,过滤器不工作?,php,ajax,wordpress,wordpress-theming,Php,Ajax,Wordpress,Wordpress Theming,我目前在我的网站上加载更多帖子的功能方面遇到了一些问题。您可以看到,默认情况下,它按正确的顺序显示最近的四篇文章。然而,当我点击“加载更多”按钮时,它确实会显示更多的帖子,然而,它只是以随机顺序堆叠起来 我已经为此奋斗了近两天,尝试了我遇到的一切,也从我的朋友那里得到了帮助,他实际上是一位经验丰富的WordPress开发人员,他也没有找到解决方案 我做了一些研究,并尝试在没有任何运气的情况下添加'suppress\u filters'=true。这是我到目前为止的代码 这是按正确顺序显示默认四篇

我目前在我的网站上加载更多帖子的功能方面遇到了一些问题。您可以看到,默认情况下,它按正确的顺序显示最近的四篇文章。然而,当我点击“加载更多”按钮时,它确实会显示更多的帖子,然而,它只是以随机顺序堆叠起来

我已经为此奋斗了近两天,尝试了我遇到的一切,也从我的朋友那里得到了帮助,他实际上是一位经验丰富的WordPress开发人员,他也没有找到解决方案

我做了一些研究,并尝试在没有任何运气的情况下添加
'suppress\u filters'=true
。这是我到目前为止的代码

这是按正确顺序显示默认四篇文章的代码:

<section class="posts-container">
        <div class="container">
            <h1 class="earlier-posts-title mt-5 text-center"><?php echo get_theme_mod('earlier_posts_title'); ?></h1>
            <div class="container-fluid">
                <div class="row mt-5 mb-5 misha_posts_wrap">

                    <?php if(have_posts()) : ?>
                    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                    <div class="col-lg-6 mb-4">
                        <?php if(has_post_thumbnail()): ?>
                        <div class="thumbnail-container">
                            <?php the_post_thumbnail('', array('class' => 'thumbnail-post')); ?>
                        </div>
                        <?php endif; ?>
                        <h1 class="thumbnail-title mt-3 text-center"><?php the_title(); ?></h1>
                        <p><?php echo the_time(); ?></p>
                        <div class="meta">
                            <p class="thumbnail-meta mt-3 text-center"><i class="far fa-clock"></i> Skrevet den <?php the_time('j. F Y');?></p>
                        </div>
                            <p class="thumbnail-content-text text-left"><b class="text-left"><?php the_excerpt();?></b></p>
                        </div>
                        <?php endwhile; ?>
                        <?php endif; ?>
                        <?php endif;?>
                        <?php
                    global $wp_query; // you can remove this line if everything works for you
                    if (  $wp_query->max_num_pages > 1 )
                        echo '<div class="misha_loadmore">More posts</div>'; // you can use <a> as well
                ?>
                </div>
            </div>
        </div>
    </section>
最后但并非最不重要的是functions.php文件:

function misha_my_load_more_scripts() {

    global $wp_query; 

    // In most cases it is already included on the page and this line can be removed
    wp_enqueue_script('jquery');

    // register our main script but do not enqueue it yet
    wp_register_script( 'my_loadmore', get_stylesheet_directory_uri() . '/myloadmore.js', array('jquery') );

    // now the most interesting part
    // we have to pass parameters to myloadmore.js script but we can get the parameters values only in PHP
    // you can define variables directly in your HTML but I decided that the most proper way is wp_localize_script()
    wp_localize_script( 'my_loadmore', 'misha_loadmore_params', array(
        'ajaxurl' => site_url() . '/wp-admin/admin-ajax.php', // WordPress AJAX
        'posts' => json_encode( $wp_query->query_vars ), // everything about your loop is here
        'current_page' => get_query_var( 'paged' ) ? get_query_var('paged') : 1,
        'max_page' => $wp_query->max_num_pages
    ) );

    wp_enqueue_script( 'my_loadmore' );
}

add_action( 'wp_enqueue_scripts', 'misha_my_load_more_scripts' );

function misha_loadmore_ajax_handler(){

    // prepare our arguments for the query
    $args = json_decode(stripslashes($_POST['query']),true);
    $args['paged'] = $_POST['page'] + 1;
    $args['post_type'] = 'post';
    $args['order'] = 'DESC';
    $args['orderby'] = 'date';
    $args['post_status'] = 'publish';
    // it is always better to use WP_Query but not here
    query_posts( $args );

    if( have_posts() ) :

        // run the loop
        while( have_posts() ): the_post();

            // look into your theme code how the posts are inserted, but you can use your own HTML of course
            // do you remember? - my example is adapted for Twenty Seventeen theme
            echo '<div class="col-lg-6 mb-4">';
            echo '<div class="thumbnail-container">';
            the_post_thumbnail('', array('class' => 'thumbnail-post'));
            echo '</div>';
            echo '<h1 class="thumbnail-title mt-3 text-center">';
            echo the_title();
            echo '</h1>';
            echo '<div class="meta">';
            echo '<p class="thumbnail-meta mt-3 text-center"><i class="far fa-clock"></i> Skrevet den ';
            echo the_time('j. F Y');
            echo '</p>';
            echo '</div>';
            echo '<p class="thumbnail-content-text text-left"><b class="text-left">';
            echo the_excerpt();
            echo '</b></p>';
            echo '</div>';
            echo '</div>';

        endwhile;

    endif;
    die;
}

add_action('wp_ajax_loadmore', 'misha_loadmore_ajax_handler');
add_action('wp_ajax_nopriv_loadmore', 'misha_loadmore_ajax_handler');
function misha\u my\u load\u more\u scripts(){
全局$wp_查询;
//在大多数情况下,它已经包含在页面上,可以删除该行
wp_排队_脚本('jquery');
//注册我们的主脚本,但不要将其排队
wp_register_脚本('my_loadmore',get_stylesheet_directory_uri()。/myloadmore.js',array('jquery');
//现在是最有趣的部分
//我们必须将参数传递给myloadmore.js脚本,但我们只能在PHP中获取参数值
//您可以直接在HTML中定义变量,但我认为最合适的方法是wp_localize_script()
wp_本地化_脚本('my_loadmore','misha_loadmore_params',数组(
'ajaxurl'=>site_url()。/wp admin/admin ajax.php',//WordPress ajax
'posts'=>json\u encode($wp\u query->query\u vars),//关于循环的所有内容都在这里
“当前页面”=>获取查询变量('paged')?获取查询变量('paged'):1,
“最大页数”=>$wp\u查询->最大页数
) );
wp_enqueue_脚本('my_loadmore');
}
添加操作(“wp\u排队脚本”、“misha\u我的加载更多脚本”);
函数misha\u loadmore\u ajax\u handler(){
//为查询准备参数
$args=json_decode(stripslashes($_POST['query']),true);
$args['paged']=$\u POST['page']+1;
$args['post_type']='post';
$args['order']='DESC';
$args['orderby']='date';
$args['post_status']='publish';
//使用WP_查询总是比较好的,但这里不行
查询职位($args);
如果(have_posts()):
//循环
while(have_posts()):the_post();
//查看主题代码如何插入帖子,当然可以使用自己的HTML
//你还记得吗?-我的例子是改编为217主题的
回声';
回声';
_post_缩略图(“”,数组('class'=>'缩略图post');
回声';
回声';
附和标题();
回声';
回声';
echo'

Skrevet den'; 呼应时间(“j.F Y”); 回声“

”; 回声'; echo'

”; 呼应_摘录(); 回声“

”; 回声'; 回声'; 结束时; endif; 死亡 } 添加动作(“wp\u ajax\u loadmore”、“misha\u loadmore\u ajax\u handler”); 添加动作(“wp_ajax_nopriv_loadmore”、“misha_loadmore_ajax_handler”);
因此,根据我的论文,问题在于functions.php文件中的misha_loadmore_ajax_处理程序,因为只要我点击loadmore按钮,所有帖子都会按随机顺序排序。你们也可以看到,为了解决这个问题,我应用了很多过滤器。我只是希望它能正确显示

代码来自Misha,链接如下:

一般来说,我对WordPress开发和PHP是相当陌生的


我做错了什么?任何帮助都将不胜感激。

仅使用'suppress\u filters'=true,无需在$args数组中订购。。 (如果排序前需要-使用pre_get_post)

function misha_my_load_more_scripts() {

    global $wp_query; 

    // In most cases it is already included on the page and this line can be removed
    wp_enqueue_script('jquery');

    // register our main script but do not enqueue it yet
    wp_register_script( 'my_loadmore', get_stylesheet_directory_uri() . '/myloadmore.js', array('jquery') );

    // now the most interesting part
    // we have to pass parameters to myloadmore.js script but we can get the parameters values only in PHP
    // you can define variables directly in your HTML but I decided that the most proper way is wp_localize_script()
    wp_localize_script( 'my_loadmore', 'misha_loadmore_params', array(
        'ajaxurl' => site_url() . '/wp-admin/admin-ajax.php', // WordPress AJAX
        'posts' => json_encode( $wp_query->query_vars ), // everything about your loop is here
        'current_page' => get_query_var( 'paged' ) ? get_query_var('paged') : 1,
        'max_page' => $wp_query->max_num_pages
    ) );

    wp_enqueue_script( 'my_loadmore' );
}

add_action( 'wp_enqueue_scripts', 'misha_my_load_more_scripts' );

function misha_loadmore_ajax_handler(){

    // prepare our arguments for the query
    $args = json_decode(stripslashes($_POST['query']),true);
    $args['paged'] = $_POST['page'] + 1;
    $args['post_type'] = 'post';
    $args['order'] = 'DESC';
    $args['orderby'] = 'date';
    $args['post_status'] = 'publish';
    // it is always better to use WP_Query but not here
    query_posts( $args );

    if( have_posts() ) :

        // run the loop
        while( have_posts() ): the_post();

            // look into your theme code how the posts are inserted, but you can use your own HTML of course
            // do you remember? - my example is adapted for Twenty Seventeen theme
            echo '<div class="col-lg-6 mb-4">';
            echo '<div class="thumbnail-container">';
            the_post_thumbnail('', array('class' => 'thumbnail-post'));
            echo '</div>';
            echo '<h1 class="thumbnail-title mt-3 text-center">';
            echo the_title();
            echo '</h1>';
            echo '<div class="meta">';
            echo '<p class="thumbnail-meta mt-3 text-center"><i class="far fa-clock"></i> Skrevet den ';
            echo the_time('j. F Y');
            echo '</p>';
            echo '</div>';
            echo '<p class="thumbnail-content-text text-left"><b class="text-left">';
            echo the_excerpt();
            echo '</b></p>';
            echo '</div>';
            echo '</div>';

        endwhile;

    endif;
    die;
}

add_action('wp_ajax_loadmore', 'misha_loadmore_ajax_handler');
add_action('wp_ajax_nopriv_loadmore', 'misha_loadmore_ajax_handler');
$args = json_decode(stripslashes($_POST['query']),true);
$args['paged'] = $_POST['page'] + 1;
$args['post_type'] = 'post';
$args['post_status'] = 'publish';
$args['suppress_filters'] = true;

query_posts( $args );