使用 Ajax 的带有自定义分类法的 Wordpress 多个自定义帖子类型过滤器 - 所有新创建的帖子都不会在响应中显示

Posted

技术标签:

【中文标题】使用 Ajax 的带有自定义分类法的 Wordpress 多个自定义帖子类型过滤器 - 所有新创建的帖子都不会在响应中显示【英文标题】:Wordpress Multiple Custom Post Type filters with Custom Taxonomies using Ajax - all newly created posts do not show in response 【发布时间】:2021-11-12 18:19:42 【问题描述】:

更新:好吧,我回答了我自己的问题。任何想帮助我在回复中添加分页的人,我很乐意给你买一品脱适合你的东西。 :) 这里需要清理一些代码。会稍后再做。

-

我在名为“见解”的自定义帖子类型中有大约 45 个帖子,我的过滤器工作正常。我使用 CPT UI 将帖子移至名为“insight”的帖子类型,一切似乎仍然正常。有 5 种自定义分类法可用于 ajax 过滤器网格。现在,任何新创建的帖子都将显示在 WP 查询中,但不会在表单操作后返回。因此,例如,帖子 46 和 47 不会显示在过滤器上,但所有较旧的帖子都会并且正在正确过滤。我无法弄清楚发生了什么。我想知道迁移帖子类型是否有问题?分享我在下面使用的代码,并感谢任何...见解。这是我在这里的第一个问题,如果这不违反政策,我愿意为此支付指导费用。提前感谢您的帮助。

--在我的functions.php

            global $wp_query;
wp_localize_script( 'ajax-pagination', 'ajaxpagination', array(
    'ajaxurl' => admin_url( 'admin-ajax.php' ),
    'query_vars' => json_encode( $wp_query->query )
));

require_once( get_template_directory() . '/library/functions/filter-scripts.php'); 
require_once( get_template_directory() . '/library/functions/ajax-filter-insights.php');

--/library/functions/filter-scripts.php

            <?php
/*
* Enqueue scripts.js if file scripts.js exists
*/
function load_scripts() 

    wp_enqueue_script('ajax', get_template_directory_uri() . '/assets/js/filter-scripts.js', array('jquery'), NULL, true);

    wp_localize_script('ajax' , 'wpAjax',
        array('ajaxUrl' => admin_url('admin-ajax.php'))
    );



add_action( 'wp_enqueue_scripts', 'load_scripts' );

--/assets/js/filter-scripts.js

(function ($) 

  $(document).ready(function () 

    $(document).on('submit', '[data-js-form=filter]', function (e) 

      e.preventDefault();
      var data = $(this).serialize();

      $.ajax(
        url: wpAjax.ajaxUrl,
        data: data,
        type: 'post',
        success: function (result) 
          $('[data-js-filter=target]').html(result);
        ,
        error: function (result) 
          console.warn(result);
        
      );


    );
  );

)(jQuery);

--/library/functions/ajax-filter-insights.php

    <?php add_action('wp_ajax_myfilter', 'misha_filter_function'); // wp_ajax_ACTION HERE
add_action('wp_ajax_nopriv_myfilter', 'misha_filter_function');

function misha_filter_function()
    $args = array(
        'post_type' => 'insight',
        'post_status' => 'published'
    );



            if( isset( $_POST['all-services'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_service',
                    'field' => 'id',
                    'terms' => $_POST['insight-service']
                );

            


            if( isset( $_POST['all-types'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_types',
                    'field' => 'id',
                    'terms' => $_POST['insight-types']
                );

            
            if( isset( $_POST['all-topics'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_topics',
                    'field' => 'id',
                    'terms' => $_POST['insight-topics']
                );

            
            if( isset( $_POST['all-months'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_months',
                    'field' => 'id',
                    'terms' => $_POST['insight-months']
                );

            
            if( isset( $_POST['all-years'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_years',
                    'field' => 'id',
                    'terms' => $_POST['insight-years']
                );

            

            if( isset( $_POST['insight-service'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_service',
                    'field' => 'id',
                    'terms' => $_POST['insight-service']
                );

            


            if( isset( $_POST['insight-type'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_type',
                    'field' => 'id',
                    'terms' => $_POST['insight-type']
                );

            


            if( isset( $_POST['insight-topic'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_topic',
                    'field' => 'id',
                    'terms' => $_POST['insight-topic']
                );

            
            if( isset( $_POST['insight-month'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_month',
                    'field' => 'id',
                    'terms' => $_POST['insight-month']
                );

            
            if( isset( $_POST['insight-year'] ) ) 
                $args['tax_query'][] = array(
                    'taxonomy' => 'insight_year',
                    'field' => 'id',
                    'terms' => $_POST['insight-year']
                );

            




            $query = new WP_Query( $args );

            if( $query->have_posts() ) : ?>
<style>
    .post-grid__col 
        display: none;
    
</style>
<div class="container-fluid post-grid p--normal">
    <div class="row my-3">
        <?php
                while( $query->have_posts() ): $query->the_post(); ?>


        <div class="post-grid__col col-12 col-md-6 col-lg-4 m-0">
            <a href="<?php echo the_permalink();?>">
                <div class="post-card h-100 animate__animated animate__fadeInUp">
                    <div class="post-card__thumb"
                        style="background: url(<?php echo get_the_post_thumbnail_url();?>) no-repeat; background-size: 100%; background-position: center;">
                        <?php include (TEMPLATEPATH . '/includes/general/post-tax-term.php'); ?>

                    </div>
                    <p class="text--lightblue text-uppercase letter-spacing--261 font-53-ex"> <?php echo get_the_date();?>
                    </p>

                    <h2 class="post-card__title">
                        <?php echo the_title();?>
                    </h2>
                </div>
            </a>

        </div>
        <?php
                endwhile;

                wp_reset_postdata();
                ?>

        <div class="col-12">
            <div class="load-btn__wrapper d-flex justify-content-between align-items-center">
                <a href="#" id="loadMore" class="cta-btn">
                    <div class="cta-inner cta-inner--inverted d-flex align-items-center"><span
                            class="arrow_carrot-right text-white"></span><span class="btn-label">Show More</span></div>
                </a>

                <p class="totop">
                    <a href="#filter" class="no-transform">Back to top &#9650;</a>
                </p>
            </div>
        </div>
        <script>
            jQuery(function ($) 

                $(function () 
                    $(".post-grid__col").slice(0, 9).show();
                    $("#loadMore").on('click', function (e) 
                        e.preventDefault();
                        $(".post-grid__col:hidden").slice(0, 9).fadeIn();
                        if ($(".post-grid__col:hidden").length < 9) 
                            $("#loadMore").fadeOut('slow');
                        

                    );
                );

                $("a[href='#filter']").click(function () 
                    $("html, body").animate(
                        scrollTop: $('#filter').offset().top - 140
                    , "slow");
                    return false;
                );

                $(window).scroll(function () 
                    if ($(this).scrollTop() > 50) 
                        $('.totop a').fadeIn();
                     else 
                        $('.totop a').fadeOut();
                    

                );
            );
        </script>
        <?php
            else :
                echo '<div class="post-grid__col col-12 mt-5 pt-5 no-results-found">
                <div class="post-card h-100 animate__animated animate__fadeInUp border-right-0">
                   <p class="display-4">No results found.</p>
                </div>


        </div>';
            endif;

    die();

--- 带有表单过滤器和原始查询的 page-insights.php

【问题讨论】:

【参考方案1】:

更新:新发布的项目在过滤后未显示的原因是一个或多个过滤器分类为空。我在过滤器下拉菜单上有 hide_empty=false ,但是有没有办法为过滤后的响应做到这一点? ——目前可行的“解决方案”是,在这种情况下确实不应该有一个空的分类法,所以我应该想办法要求它们发表。这里还有一些我在构建中取出的代码,例如。本地化分页脚本。目前无法进行分页响应。否则,现在一切都按预期工作。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于使用 Ajax 的带有自定义分类法的 Wordpress 多个自定义帖子类型过滤器 - 所有新创建的帖子都不会在响应中显示的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress 过滤多个下拉分类以通过 ajax 显示自定义字段

如何在 laravel 4.2 中使用带有自定义预过滤器的 AJAX 上传 CSV 文件

带有自定义标头的 Ajax 请求发送到启用 CORS 的 Web API 服务器

带有自定义标头的跨域 jquery ajax api 调用未命中服务器

csharp 带有自定义分类和消息的SharePoint 2010自定义日志条目

PHP 带有自定义帖子类型和自定义分类的WordPress图库页面