使用分类创建页面选择器

时间:2013-05-24 作者:Duncan Morley

我创建了一个自定义帖子类型,并将自定义分类法中的一个术语分配给这个CPT中的每个页面。

我想在我的网站前端创建两个选择框如果有人能帮上忙,那就太好了。

3 个回复
最合适的回答,由SO网友:Duncan Morley 整理而成

我很想知道你对我的最终解决方案的意见。如果能做得更好的话,请随时拉我上来。解决方案如下:

<select id="select-category">
    <option class="first-option" value="-1">Select Product Category</option>
        <?php
        $taxonomy = \'category\';
        $terms = get_terms($taxonomy, array(\'orderby\' => \'name\'));

        foreach($terms as $term) {
            echo \'<option value="\'.$term->term_id.\'">\'.$term->name.\'</option>\';
        } ?>
</select>

<select id="select-product" disabled="disabled"></select>

<input id="myButton" type="submit" value="Take me to this product" />
在我的函数中紧随其后。php文件:

function implement_ajax() {
$term_id = $_POST[\'id\'];   

echo \'<option class="first-option" value="-1">Select Product</option>\';

$args = array(
    \'post_type\' => \'products\',
    \'taxonomy\' => \'category\',
    \'terms\'    => $term_id
);

global $wp_query;
$wp_query = new WP_Query($args);

while ($wp_query->have_posts()) : $wp_query->the_post()
    echo \'<option value="\' . get_permalink() . \'">\' . get_the_title() . \'</option>\';
endwhile;
};
add_action(\'wp_ajax_my_special_ajax_call\', \'implement_ajax\');
add_action(\'wp_ajax_nopriv_my_special_ajax_call\', \'implement_ajax\');
然后,我默示了一些jQuery,以将所有内容组合在一起。我很想知道这是否是最好、最有效的方法。

SO网友:s_ha_dum

这是一个非常广泛的问题,所以我将提供一个大纲。

使用get_terms 创建第一个选择框<这将在PHP中完成AJAX API.<在AJAX回调中,您会有一个非常标准的WP_Query 合上柱子

Be aware, that pure Javascript issues/questions are off-topic here per the faq. 显然,尽管与Javascript相关,但AJAX API的使用不会偏离主题,因为这是一个特定于WordPress的API。

SO网友:GhostToast

这是您需要的PHP。之后,您将需要一些JavaScript来选择性地激活$posts_by_terms 取决于哪个$list_of_terms 已选择。这很简单。

<?php
    // we don\'t know your post type or taxonomy
    $taxonomy = \'my-custom-taxonomy\';
    $post_type = \'my-post-type\';
    $terms = get_terms($taxonomy, array(\'orderby\' => \'name\'));

    // first dropdown
    $list_of_terms  = \'<select>\';
    $list_of_terms .= \'<option value="*">Select Category</option>\';

    // rest of dropdowns
    $posts_by_terms = array();

    $i = 0;
    foreach($terms as $term){
        // each posts_by_terms is a select box
        $posts_by_terms[$i]  = \'<select>\';
        $posts_by_terms[$i] .= \'<option value="*">Choose Post</option>\';

        $args = array(
            \'post_type\' => $post_type,
            \'posts_per_page\' => -1,
            \'tax_query\' => array(
                array(
                    \'taxonomy\' => $taxonomy,
                    \'field\' => \'id\',
                    \'terms\' => $term->term_id
                )
            )
        );

        $term_loop = new WP_Query($args);
        while($term_loop->have_posts()) : $term_loop->the_post();
            $posts_by_terms[$i] .= \'<option value="\'.get_permalink($post->ID).\'">\'.get_the_title().\'</option>\';
        endwhile;
        wp_reset_query();

        // wrap it up
        $posts_by_terms[$i] .= \'</select>\';

        // add to first box (each term)
        $list_of_terms .= \'<option value="\'.$term->slug.\'">\'.$term->name.\'</option>\';

        $i++;
    }
    $list_of_terms .= \'</select>\';

    echo $list_of_terms;
    implode(\'\',$posts_by_terms);
?>

结束