使用 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 ▲</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 调用未命中服务器