具有修改的术语链接的分层分类列表

时间:2020-05-15 作者:reti

我有两个函数显示所选分类法的术语列表:

第一个功能:

$terms = get_the_terms(get_the_ID(), \'MY_TAXONOMY\');
if (!is_wp_error($terms) && !empty($terms)) {
    foreach ($terms AS $term) {
        $name = $term->name;
        $link = add_query_arg(\'fwp_typ\', FWP()->helper->safe_value($term->slug), \'https://www.MYWEBSITE.com/\');
        echo "<a href=\'$link\'>$name</a><br />";
    }
}       
第二个功能:

    global $post;
    $taxonomy = \'MY_TAXONOMY\';
    $terms = wp_get_post_terms( $post->ID, $taxonomy, array( "fields" => "ids" ) );
    if( $terms ) {
        echo \'<?ul>\';
        $terms = trim( implode( \',\', (array) $terms ), \' ,\' );
        wp_list_categories( \'title_li=&taxonomy=\' . $taxonomy . \'&include=\' . $terms );
        echo \'<?/ul>\';
    }

第一种方法忽略层次结构,但根据需要转换链接,即,这样它们就可以查询WP的Facet插件。我知道这句话在这里很关键:

$link = add_query_arg(\'fwp_typ\', FWP()->helper->safe_value($term->slug), \'https://www.MYWEBSITE.com/\');

第二个包括层次结构,但链接并没有引导到我想要的地方。如何使第二个函数转换链接与第一个一样?

2 个回复
最合适的回答,由SO网友:reti 整理而成

解决了难看的问题,但有效。过滤器的一般形式:

<?php
add_filter(\'term_link\', function ($termlink, $term, $taxonomy) {
    if (\'CPT-TAXONOMY-NAME\' == $taxonomy) {
        $termlink = trailingslashit(get_home_url()) . \'?FACETWP-FACET-NAME=\' . $term->slug;
    }
    return $termlink;
}, 10, 3);
功能中的功能。php:

<?php
function list_hierarchical_terms($taxonomy) {
    global $post;
    $terms = wp_get_post_terms( $post->ID, $taxonomy, array( "fields" => "ids" ) );
    if( $terms ) {
        echo \'<?ul>\';
        $terms = trim( implode( \',\', (array) $terms ), \' ,\' );
        wp_list_categories( \'title_li=&taxonomy=\' . $taxonomy . \'&include=\' . $terms );
        echo \'<?/ul>\';
    }
}
现在我不知道如何把它写得更简单。filter in函数的函数。php:

<?php
function termlink_transformation_freuciv_post_type($termlink, $term, $taxonomy)
{
    if (\'freuciv_post_type\' == $taxonomy) {
        $termlink = trailingslashit(get_home_url()) . \'?fwp_typ=\' . $term->slug;
    }
    return $termlink;
}

function termlink_transformation_category($termlink, $term, $taxonomy)
{
    if (\'category\' == $taxonomy) {
        $termlink = trailingslashit(get_home_url()) . \'?fwp_categories=\' . $term->slug;
    }
    return $termlink;
}

function termlink_transformation_hierarchical_tags($termlink, $term, $taxonomy)
{
    if (\'hierarchical_tags\' == $taxonomy) {
        $termlink = trailingslashit(get_home_url()) . \'?fwp_tags=\' . $term->slug;
    }
    return $termlink;
}
在模板部分:

<?php
add_filter(\'term_link\', \'termlink_transformation_freuciv_post_type\', 10, 3);
list_hierarchical_terms(\'freuciv_post_type\', \'<h5 style="margin-bottom: 5px">Typ: </h5>\');
remove_filter( \'term_link\', \'termlink_transformation_freuciv_post_type\', 10 );

add_filter(\'term_link\', \'termlink_transformation_category\', 10, 3);
list_hierarchical_terms(\'category\', \'<h5 style="margin-bottom: 5px; margin-top: 10px;">Kategorien: </h5>\');
remove_filter( \'term_link\', \'termlink_transformation_category\', 10 );

add_filter(\'term_link\', \'termlink_transformation_hierarchical_tags\', 10, 3);
list_hierarchical_terms(\'hierarchical_tags\', \'<h5 style="margin-bottom: 5px; margin-top: 10px;">Tags: </h5>\');
remove_filter( \'term_link\', \'termlink_transformation_hierarchical_tags\', 10 );  
这里重复太多了。我不知道如何简化它。

SO网友:Shazzad

这可以通过多种方式实现。其中之一是过滤与所需结构的术语链接。

以下是一个可以根据您的结构转换术语链接的函数。忽略第一个参数,因为我们将使用此函数作为过滤器回调。

/**
 * @param string  $termlink Term link.
 * @param WP_Term $term Term object.
 */
function wpse366737_pre_term_link( $termlink, $term ) {
    return add_query_arg(
        \'fwp_typ\', 
        FWP()->helper->safe_value( $term->slug ), 
       \'https://www.MYWEBSITE.com/\'
    );
}
现在,我们有了一个函数,可以在适当的位置使用它来修改术语链接。完成后,我们将删除过滤器,以便使用术语链接的其他脚本不会受到影响。

global $post;

$taxonomy = \'MY_TAXONOMY\';

$terms = wp_get_post_terms( $post->ID, $taxonomy, array( "fields" => "ids" ) );

if ( $terms ) {
    echo \'<ul>\';

    $terms = trim( implode( \',\', (array) $terms ), \' ,\' );

    // as we needed.
    add_filter( \'pre_term_link\', \'wpse366737_pre_term_link\', 10, 2 );

    // this list will display the filtered url for term.
    wp_list_categories( \'title_li=&taxonomy=\' . $taxonomy . \'&include=\' . $terms );

    // remove the filter so other script doesn\'t get affected.
    remove_filter( \'pre_term_link\', \'wpse366737_pre_term_link\', 10 );

    echo \'</ul>\';
}