在单个URL中组合多个自定义用户分类

时间:2015-12-18 08:37:47

标签: wordpress custom-taxonomy

我为用户创建了自定义用户分类,并且它对单一分类法有效。

从Bellow参考指南我创建了自定义用户分类。

参考指南: - http://justintadlock.com/archives/2011/10/20/custom-user-taxonomies-in-wordpress

贝娄是分类学的结构

(registered taxonomy)  profession

                              Dietitian (under the profession )



(registered taxonomy) city
                         NewYork(under the city)

我的slu name名称expert

在这里,我想在Dietitian city中显示用户为NewYork的过滤结果。因此,它会显示在个人资料中选择了上述选项的所有用户。

现在我想要的网址类似www.test.com/expert/dietitian/newyork 用户在用户个人资料中选择了Dietitian,NewYork。是否有任何解决方案可以合并Dietitian,NewYork

单个字词的网址如下: - www.test.com/expert/dietitian/

3 个答案:

答案 0 :(得分:1)

我假设你花了很多时间在justintadlock的教程上,所以我将只涉及多分类过滤所需的部分内容并在前面展示 - 端。

在阅读长篇文章之前,您可以尝试http://playground.georgemanousarides.com/

所以,首先是第一件事。 单个分类和多个分类的逻辑基础是相同的。 在注册了分类法及其术语并完成了wp-admin所需的所有工作后,我们将需要:

A)一个页面(我们称之为TAX-QUERY PAGE),访问者可以在其中选择分类查询。

B)另一页(我们称之为TAX-RESULTS PAGE),其中将显示TAX-QUERY PAGE的结果。

让我们潜入

单一分类

TAX-QUERY PAGE

在学习完本教程之后,显示分类法链接的页面应该以其原始形式显示,如下所示:

single taxonomy tax-query page

访客"选择"只需点击提供的链接即可查看哪种分类。

  

请注意:

     

A)以下链接:

     
      
  1. 表白如下:   www.example.com/user/profession/developer /
  2.   
  3. 城市将是:   www.example.com/user/city/gotham /
  4.         

    B) slugs" user / city"和"用户/专业"在函数中定义: my_register_user_taxonomy>> register_taxonomy>>重写>>蛞蝓

TAX-RESULTS PAGE

点击上面提到的链接会转到一个页面(当然需要由您定义),该页面显示相同分类术语下的所有用户。

这是通过创建自定义分类模板来实现的。

您可以创建taxonomy-profession-developer.php文件来处理单个分类和术语,或者使用taxonomy-profession.php来处理单个分类法及其所有分类法。所有分类法及其术语的术语或taxonomy.php。

在我看来,如果您不希望您的服务器充斥着由您手动创建的模板文件,您应该使用taxonomy.php并为所有分类法制作一个通用的teplate,从而破坏您的结果想要自动显示。

  

请注意:

     

A)要通过用户进行迭代并仅获取所需分类术语下的内容,需要自定义查询(在taxonomy.php文件中),如教程中所述和解释的那样。 / p>      

B)永久链接应位于 wp-admin>>的 帖子名称 选项中设置>>永久链接 以便wordpress可以找到您的分类法,获取文件taxonomy.php并提供有关可在taxonomy.php文件中使用的所选分类法的有用信息。

多个分类

TAX-QUERY PAGE

我们需要创建一个页面,访问者可以从自定义分类中选择术语。此页面将通过链接(作为获取变量**)提供所需条款的TAX-RESULTS PAGE(taxonomy.php),以便进行查询。

**为了在TAX-RESULTS PAGE中有相当的永久链接,我们需要在function.php中添加以下重写函数(找到它here),并刷新wp-admin中的永久链接: / p>

function eg_add_rewrite_rules() {
  global $wp_rewrite;
  $new_rules = array(
      'user/(profession|city)/(.+?)/(profession|city)/(.+?)/?$' => 'index.php?post_type=eg_event&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2) . '&' . $wp_rewrite->preg_index(3) . '=' . $wp_rewrite->preg_index(4),
      'user/(profession|city)/(.+)/?$' => 'index.php?post_type=eg_event&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2)
  );
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'eg_add_rewrite_rules' );
  

请注意

     

如果您注册了更多的分类标准,那么" profession | city"在功能应该成为"职业|城市| tax1 | tax2 | tax3"。

所以TAX-QUERY PAGE将是:

<强> HTML

<div id="taxonomies">
    <h1>Find your professional</h1>
    <form>
        <?php if ( $taxonomies = get_object_taxonomies( 'user' ) ) : //get all taxonomies under the object_type "user" ( The second parameter given to the function my_register_user_taxonomy of the tutorial )
            foreach ( $taxonomies as $taxonomy ) : ?>
                <p>
                    <ul>
                        <fieldset id="<?php echo esc_attr( $taxonomy ); ?>"> <!-- group the form by taxonomies -->
                            <legend><h2>Choose <?php echo $taxonomy; ?></h2></legend>
                            <?php if ( $terms = get_terms( $taxonomy ) ) : //get taxonomy's terms
                                foreach ( $terms as $term ) : ?>
                                    <li><input type="checkbox" value="<?php echo esc_attr( $term -> slug ); ?>"> <?php echo $term -> name; ?></li>
                                <?php   endforeach;
                            endif; ?>
                        </fieldset>
                    </ul>
                </p>
            <?php   endforeach;
        endif; ?>
    </form>
    <a id="multiTaxSubmit" href="<?php echo esc_attr( get_home_url() . '/user' ); ?>">SUBMIT</a> <!-- this link is processed by jQuery to provide the taxonomy.php with the proper values. The href attribute is the base url needed by the taxonomy.php -->
</div>

JQUERY (可以放在外部文件中)

$( document ).ready( function() {
    $( '#multiTaxSubmit' ).click( function ( event ){
        event.preventDefault(); //prevent default link url from loading
        var taxQuerySubmit = $( this ),
                hasChecked = 0;
                querySlug = taxQuerySubmit.attr( 'href' ); //get multitax url base from link href attr
        $( '#taxonomies fieldset' ).each( function() { //iterate each taxonomy
            var checkedTerms = $( this ).find( 'input:checked' ),
                    checkedLength = checkedTerms.length; //how many terms has the user selected
            if ( checkedLength ) {
                hasChecked += checkedLength;
                querySlug += '/' + $( this ).attr( 'id' ) + '/'; //add taxonomy slug to query url
                checkedTerms.each( function( index, value ) {
                    var comma = ( index == checkedLength-1 ? '' : ',' );
                    querySlug += $( this ).val() + comma;
                } );
            }
        } );
        if ( hasChecked ) {
            window.location = querySlug;
        } else {
            alert( 'Please enter some criteria.' );
        }
    } );
} );

TAX-RESULTS PAGE (taxonomy.php)

<?php
    $USERS_BY_TAX = array();
    if ( $taxonomies = get_object_taxonomies( 'user' ) ) { //get all taxonomies under the object_type "user" ( The second parameter given to the function my_register_user_taxonomy of the tutorial )
        foreach ( $taxonomies as $tax_key => $taxonomy ) {
            eval( '$check = $' . $taxonomy . ';' ); // Check if the taxonomy exists in the url. eval outputs $check = $profession, $check = $city etc.
            if ( !$check ){
                unset( $taxonomies[ $tax_key ] );
                continue;
            }
            eval( '$term_names = explode( ",", $' . $taxonomy . ' );' ); // get terms array from $$taxonomy which gives $profession,$city, the values of which are given through the url as such: $profession="designer,developer"
            $USERS_BY_TAX[ $taxonomy ] = array();
            foreach ( $term_names as $term_name ) {
                $term_obj = get_term_by( 'name', $term_name, $taxonomy ); //get term object for each given term
                $users_in_term = get_objects_in_term( $term_obj -> term_id, $taxonomy ); // find users with term
                if ( !empty( $users_in_term ) ) {
                    $USERS_BY_TAX[ $taxonomy ] = $USERS_BY_TAX[ $taxonomy ] + array_fill_keys( $users_in_term, $term_name ) ;
                }
            }
        }
    }
    /* $USERS_BY_TAX array has all the users for each taxonomy but we only need those who exist in all taxonomies */
    if ( $taxonomies ) {
        $RESULTS = $USERS_BY_TAX; // keep the initiate array intact
        $matched = array_pop( $USERS_BY_TAX ); // first array to compare
        $TAXS = $taxonomies;
        array_pop( $taxonomies );
        if ( !empty( $USERS_BY_TAX ) ) {
            foreach ( $taxonomies as $taxonomy ) {
                if ( !empty( $USERS_BY_TAX ) ) $matched = array_intersect_key( $matched, $USERS_BY_TAX[ $taxonomy ] );
            }
        }
    }
?>

/* DISPLAY */
<?php if ( $matched ) :
    foreach ( array_keys( $matched ) as $user_id ): ?>

        <div class="user-entry">
            <?php echo get_avatar( get_the_author_meta( 'email', $user_id ), '96' ); ?>
            <h2><?php the_author_meta( 'display_name', $user_id ); ?></h2>
            <?php if ( in_array( 'profession', $TAXS ) ) : ?><h3>Profession: <?php echo $RESULTS[ 'profession' ][ $user_id ]; ?></h3><?php endif;?>
            <?php if ( in_array( 'city', $TAXS ) ) : ?><h3>City: <?php echo $RESULTS[ 'city' ][ $user_id ]; ?></h3><?php endif;?>
            <?php echo wpautop( get_the_author_meta( 'description', $user_id ) ); ?>
        </div>

    <?php endforeach;
else: ?>
        <div class="user-entry">
            <h2>We are sorry. No results match your criteria.</h2>
            <h3>Please <a href="javascript:history.back()">go back</a> and search again!</h3>
        </div>
<?php endif; ?>

答案 1 :(得分:0)

此重写规则应该有效(假设&#34;专业&#34;&#34; city&#34;是分类法注册名称):

<强>代码:

function custom_rewrite_rules() {
    add_rewrite_rule('^profession/(.*)/city/(.*)?', 'index.php?profession=$matches[1]&city=$matches[2]', 'top');
}
add_action('init', 'custom_rewrite_rules');

请记住在您的网站中保存此代码后清除重新规则。

网址 http://yourdomain.com/profession/dietitian/city/newyork/

答案 2 :(得分:0)

要清除主题或插件中的永久链接或重写规则,您需要使用flush_rewrite_rules()函数。

<?php 
function custom_rewrite_rules() {
    flush_rewrite_rules();
    add_rewrite_rule( '^products/([^/]*)/([^/]*)/(\d*)?',
    'index.php?product_type=$matches[1]&product_brand=$matches[2]&p=$matches[3]',
    'top' );
        //Post Type: products
        //Taxonomy: product_type
        //Taxonomy: product_brand
}
add_action('init', 'custom_rewrite_rules');
?>