在没有页面加载的情况下,从"按类别排序帖子"菜单更改<div>中的内容

Sea*_*gan 5 javascript php wordpress jquery

我在这个网站上的第一篇文章,我正在为我的第一个自定义wordpress主题寻求一些指导.我对jQuery/AJAX非常陌生,此时它对我的大脑造成了伤害,因为整个过程在下一个过程之后就是一个学习曲线.所以请原谅我无法在线条之间看到并理解已经或可能已经存在的内容.当我搜索时,这个主题有一些结果但是我无法将这些例子转化为我的情况的工作结果......

我希望按类别在"新闻"部分对我显示的帖子进行排序... ...中有一个子菜单<div id="#container">...我的目的是让子菜单链接在我的<div id="contentbox-news">...中具体改变内容

即"最新消息","近期建设项目","新闻发布公告"等......

这是来自"page-news.php"和原始链接Cars&Coffee HFX的一些代码

<div id="news_submenu_container"><!-- begin submenu placement -->
            <ul id="news_submenu">
              <li>VIEW</li>
              <li><a href="#" onClick="get_posts_all();">ALL</a></li>
              <li><a href="#" onClick="get_posts_news();">NEWS</a></li>
              <li><a href="#" onClick="get_posts_builds();">BUILDS</a></li>
              <li><a href="#" onClick="get_posts_pr();">PR</a></li>
            </ul>
        </div><!-- end submenu placement -->

        <script>
            function get_posts_all() {
                var posts_all_var = '<?php echo "Insert Wordpress Loop here identified by Category-ID" ?>';
            document.getElementById("contentbox-news").innerHTML = posts_all_var;
            return false;
            }

            function get_posts_news() {
                var posts_news_var = '<?php echo "Huh?" ?>';
            document.getElementById("contentbox-news").innerHTML = posts_news_var;
            return false;
            }

            function get_posts_builds() {
                var posts_builds_var = '<?php echo "Cant get loop to work" ?>';
            document.getElementById("contentbox-news").innerHTML = posts_builds_var;
            return false;
            }

            function get_posts_pr() {
                var posts_pr_var = '<?php echo "DAMNIT!" ?>';
            document.getElementById("contentbox-news").innerHTML = posts_pr_var;
            return false;
            }
        </script>
Run Code Online (Sandbox Code Playgroud)

我现在理解JavaScript和PHP不能以我想的方式一起工作......显然我需要通过AJAX使用一种方法...我发现这篇关于PHP AJAX和MySQL的文章然而它对我来说太先进了,我我无法理解它并为自己创造一个有效的例子......

但是现在,从星期六开始,我已经制作了新的代码,让我这么远,我可以用PHP回应......就此而言.

            function get_posts_builds() {
                var posts_builds_var = '<?php query_posts('cat=6'); 
                                              while (have_posts()):
                                              the_post(); 
                                              the_content(); 
                                              endwhile; ?>';
            document.getElementById("contentbox-news").innerHTML = posts_builds_var;
            return false;
            }
Run Code Online (Sandbox Code Playgroud)

一旦我用这个PHP wordpress循环替换PHP回声,它似乎没有为我做的技巧和休息.

var*_*ard 0

您确实需要使用 AJAX 来实现这一点。Wordpress 有自己的方法来处理 ajax 请求,您可以通过执行下面详细介绍的几个步骤来使用它。我将尝试展示一些关于这个主题的 WP 最佳实践 - 因此可能有更快/更简单/更肮脏的方法来实现这一目标(甚至可能通过插件),这将为您提供 WordPress 主题/插件开发的良好介绍。请随意点击文档链接以更好地了解其工作原理。


1. 构建您的类别菜单

在您的代码示例中,菜单是静态的,但您最好使用动态菜单。一种解决方案可能是使用get_the_category_list,但它不允许您完全控制类别链接。我建议定义一个像这样的新导航菜单(以下代码进入您的主题functions.php):

add_action('after_setup_theme', 'add_categories_menu');
function add_categories_menu() {
  register_nav_menu('categories_menu', __('Categories Menu', 'your-theme-slug'));
}
Run Code Online (Sandbox Code Playgroud)

然后在您的模板中,将静态菜单替换为以下内容,以显示全新的菜单:

<?php wp_nav_menu(array('theme_location' => 'categories_menu')); ?>
Run Code Online (Sandbox Code Playgroud)

现在要将类别添加到菜单中,请登录 WordPress 管理,进入
外观>菜单,创建一个新菜单,为其选择主题位置“类别菜单”,然后向其中添加类别。

最后一步,我们将添加一个过滤器,以便onclick在菜单链接上添加属性,该属性将类别 slug 发送到showPostsFromCategory()我们稍后将定义的 js 函数。

这在你的functions.php中:

<?php wp_nav_menu(array('theme_location' => 'categories_menu')); ?>
Run Code Online (Sandbox Code Playgroud)

您可能想问,为什么我们在菜单项上保留类别链接?它用于 SEO 和可访问性目的:对于没有 javascript(如屏幕阅读器)或搜索爬虫的浏览器,类别页面仍然可以访问。


2. 为 AJAX 准备主题

在 Wordpress 中,所有 AJAX 请求都需要使用一个操作参数来发送,wp-admin/admin-ajax.php该参数将识别该请求,以便使用(对于非登录用户)和(对于登录用户)钩子在functions.php中捕获它。wp_ajax_nopriv_my_actionwp_ajax_my_action

因此,在继续之前的一小步是让该路径 ( wp-admin/admin-ajax.php) 在 JavaScript 中可访问。首先,在主题文件夹中创建一个用于 AJAX 进程的 js 文件,假设他的名称为./js/categories-ajax.js. 然后,在functions.php中添加以下内容,以便将此新脚本排入队列并通过脚本本地化使路径可访问:

function add_onclick_attr_categories_menu($atts, $item, $args) {
    if($args->theme_location == 'categories_menu' && $item->object == 'category') {
        $category = get_category($item->object_id);
        if($category !== null) {
            $atts['onClick'] = 'showPostsFromCategory("' . $item->slug . '")';
        }
    }
    return $atts;
}
add_filter('nav_menu_link_attributes', 'add_onclick_attr_categories_menu', 10, 3);
Run Code Online (Sandbox Code Playgroud)

这样,admin-ajax.php路径就可以在你的 JS 中使用ls.ajax_url.


3.触发ajax请求

是时候创建该showPostsFromCategory()函数了。所以让我们写下你的新内容categories-ajax.js文件。就我个人而言,为了避免在我的插件/主题开发中与 jQuery 发生任何可能的冲突,我喜欢始终将 jQuery 代码封装在JavaScript 闭包中,并使函数可以通过全局变量访问,如下所示:

add_action('wp_enqueue_scripts', 'ajax_categories_enqueue_scripts');
function ajax_categories_enqueue_scripts() {
    wp_register_script('categories_ajax', get_stylesheet_directory_uri() . '/js/categories-ajax.js', array('jquery'), '', true);
    wp_localize_script('categories_ajax', 'ls', array(
        'ajax_url'                  => admin_url('admin-ajax.php')
    ));
    wp_enqueue_script('categories_ajax');
}
Run Code Online (Sandbox Code Playgroud)

所以我现在假设函数代码位于闭包内。
基本上,我们现在需要做的是设置一个对admin-ajax.php 的$.post请求,该请求将发送以下参数:

  • action:正在调用的 AJAX 操作的标识符,以便让 Wordpress 知道稍后应该调用哪个函数。我们将其命名为dynamic_categories.
  • category:在菜单中单击的类别 slug。

所以函数代码将如下所示:

(function($){
  showPostsFromCategory = function(category_slug) {
    // code function...
  };
})(jQuery);
var showPostsFromCategory;
Run Code Online (Sandbox Code Playgroud)

这是非常基本的,您可能需要稍后添加一些错误处理和加载器。这里我们只是用 AJAX 返回替换实际的帖子,我们假设它是 HTML。JS 方面没什么可做的,所以现在让我们来处理 PHP 方面。


4. 获取所需类别的帖子

首先,在function.php中添加以下行,以便将函数 get_categories_posts() 附加到wp_ajax_dynamic_categorieswp_ajax_nopriv_dynamic_categories操作。

add_action('wp_ajax_dynamic_categories', 'get_categories_posts');
add_action('wp_ajax_nopriv_dynamic_categories', 'get_categories_posts');
Run Code Online (Sandbox Code Playgroud)

现在,我们需要在函数中执行以下操作:

  1. 检查类别标签是否有效并且是否有关联的帖子,否则显示错误。

  2. 获取与 JS 脚本发送的 slug 标识的类别关联的帖子。

  3. 循环浏览帖子并使用模板部分显示每个帖子。为此,请在主题文件夹中创建一个模板,该模板仅包含显示一篇文章所需的 HTML/PHP。您可以在 中的默认 WordPress 主题 (twentysixteen) 中看到此类模板的示例
    template-parts/content.php。在您的主题中创建相同类型的文件 - 也许已经有一个。

    您还需要更新存档模板才能使用模板部分。这非常简单,删除用于在循环显示帖子的代码并将其替换为:

     <?php get_template_part('template-parts/content'); ?>
    
    Run Code Online (Sandbox Code Playgroud)

所以整个函数代码将如下所示:

showPostsFromCategory = function(category_slug) {
    $.post(ls.ajax_url, {action: 'dynamic_categories', category: category_slug}, function success(data) {
        $('#your-post-content-wrapper').html(data); // Update the page with the new posts -- change this ID to the correct one
    });
    return false; // this is to cancel the link click, so the page isn't being redirected
}
Run Code Online (Sandbox Code Playgroud)

就这样!有了这个,您现在就可以为您的帖子类别提供动态导航。

供参考:sanitize_text_fieldget_category_by_slugget_postssetup_postdataget_template_part


请注意,这不支持分页。如果您需要这个,请查看我对此事所做的回答。


进一步阅读