如何从数据库动态加载WordPress内容?

时间:2015-06-02 00:09:57

标签: php wordpress

我为WordPress创建了一个名为Rubrics的自定义帖子类型,这只是后端用户可以看到的,所以我使用参数'public' => false创建它可以正常工作。

在另一个帖子类型(作业)中,我使用以下函数生成自定义rubrics帖子类型的列表:

<select id="ldrm-select-rubric">    

    <option data-id="0" value="default">Select a Rubric</option>

    <?php 
    $args = array( 'post_type' => 'sfwd-rubrics', 'posts_per_page' => -1 );
    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post(); ?>

        <option data-id="<?php the_ID(); ?>"><?php the_title(); ?></option>

    <?php endwhile; ?>

</select>

也可以,所以现在我有一个Rubric帖子列表出现在所有作业的编辑页面上。我想知道如何在不将所有内容加载到页面的情况下查询Rubric帖子内容。

我知道我可以使用上面的函数查询内容,但是我只想加载一旦用户选择它就从下拉列表中选择的Rubric的内容,以防止加载所有其他的rubric好。关于如何实现这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

所以如果我认为你想要保留当前的代码是正确的。这是使用标题的标题填充下拉列表。无论您喜欢与否,您都已经查询了内容。从性能角度来看,最好设置一些变量并使用Javascript来显示正确的变量。另一种选择是使用AJAX并将帖子ID发送到服务器并使用您想要的量规的内容进行响应。我将在这里演示

执行一次/简单加载

<?php
// instantiate some variables
$titles = array();
$contents = array();
// set our arrays
foreach (get_posts(array('post_type'=>'sfwd-rubrics','posts_per_page'=>-1)) as $post) {
    $titles[$post->ID] = $post->title;
    $content[$post->ID] = $post->content;
} ?>
<select id="ldrm-select-rubric">
    <?php foreach ($titles as $id => $title): ?>
        <option id="<?= $id ?>"><?= $title ?></option>
    <?php endforeach; ?>
<select>

<?php // time to echo out the contents
foreach ($contents as $id => $content): ?>
    <div id="<?= $id ?>"><?= $content ?></div>
<?php endforeach; ?>

<script type="text/javascript">
    // assuming jQuery is being loaded
    (function($) {
        var $select = $('#ldrm-select-rubric');
        $select.bind('change', function() {
           $(this).find('option').css('display', 'none');
           $('#' + $(this).val()).css('display', 'block');
        });
        $select.trigger('change');
    })(jQuery);
</script>

使用AJAX的更复杂,性能更低的示例

有一些安全功能我不会在演示中烦恼。以下是使用AJAX in WordPress

的链接
<?php // somewhere in your php wordpress code
add_action('wp_ajax_rubric_content', function() {
    echo get_post($_REQUEST['id'])->ID;
});

// Below the PHP code in your current question content
<div id="rubric-content"></div>
<script type="text/javascript">
    (function($) {
        $('#ldrm-select-rubric').bind('change', function() {
            $.ajax({
                type: 'GET',
                url: ajaxurl,
                data: {
                    action: 'rubric_content',
                    id: $(this).val(),
                },
                success: function(resp) {
                    $('#rubric-content').html(resp);
                }
            });
        });
    })(jQuery);
</script>

警告:我没有测试上面的代码,但这通常是WP AJAX的工作原理。您需要在服务器代码中添加大量验证。我强烈推荐前一个例子,因为它更简单,性能更高(查询更少),更安全。