将产品属性值链接到URL-WooCommerce

时间:2020-07-25 作者:MJ2410

我想添加一个本地产品属性值,该属性值将具有指向特定“href”值的链接。我关注了这个博客,并试图通过博客末尾提到的标记选项添加,该值变成了锚定标记链接,但href值没有正确获取。https://nicolamustone.blog/2016/03/11/make-product-attributes-linkable/

我在我的函数中添加了博客中的这个片段。php

/**
 * Register term fields
 */
add_action( \'init\', \'register_attributes_url_meta\' );
function register_attributes_url_meta() {
        $attributes = wc_get_attribute_taxonomies();

        foreach ( $attributes as $tax ) {
            $name = wc_attribute_taxonomy_name( $tax->attribute_name );

            add_action( $name . \'_add_form_fields\', \'add_attribute_url_meta_field\' );
            add_action( $name . \'_edit_form_fields\', \'edit_attribute_url_meta_field\', 10 );
            add_action( \'edit_\' . $name, \'save_attribute_url\' );
            add_action( \'create_\' . $name, \'save_attribute_url\' );
        }
}

/**
 * Add term fields form
 */
function add_attribute_url_meta_field() {

    wp_nonce_field( basename( __FILE__ ), \'attrbute_url_meta_nonce\' );
    ?>

    <div class="form-field">
        <label for="attribute_url"><?php _e( \'URL\', \'domain\' ); ?></label>
        <input type="url" name="attribute_url" id="attribute_url" value="" />
    </div>
    <?php
}

/**
 * Edit term fields form
 */
function edit_attribute_url_meta_field( $term ) {

    $url = get_term_meta( $term->term_id, \'attribute_url\', true );
    wp_nonce_field( basename( __FILE__ ), \'attrbute_url_meta_nonce\' );
    ?>
    <tr class="form-field">
        <th scope="row" valign="top"><label for="attribute_url"><?php _e( \'URL\', \'domain\' ); ?></label></th>
        <td>
            <input type="url" name="attribute_url" id="attribute_url" value="<?php echo esc_url( $url ); ?>" />
        </td>
    </tr>
    <?php
}

/**
 * Save term fields
 */
function save_attribute_url( $term_id ) {
    if ( ! isset( $_POST[\'attribute_url\'] ) || ! wp_verify_nonce( $_POST[\'attrbute_url_meta_nonce\'], basename( __FILE__ ) ) ) {
        return;
    }

    $old_url = get_term_meta( $term_id, \'attribute_url\', true );
    $new_url = esc_url( $_POST[\'attribute_url\'] );


    if ( ! empty( $old_url ) && $new_url === \'\' ) {
        delete_term_meta( $term_id, \'attribute_url\' );
    } else if ( $old_url !== $new_url ) {
        update_term_meta( $term_id, \'attribute_url\', $new_url, $old_url );
    }
}

/**
 * Show term URL
 */
add_filter( \'woocommerce_attribute\', \'make_product_atts_linkable\', 10, 3 );
function make_product_atts_linkable( $text, $attribute, $values ) {
    $new_values = array();
    foreach ( $values as $value ) {

        if ( $attribute[\'is_taxonomy\'] ) {
            $term = get_term_by( \'name\', $value, $attribute[\'name\'] );
            $url = get_term_meta( $term->term_id, \'attribute_url\', true );

            if ( ! empty( $url ) ) {
                $val = \'<a href="\' . esc_url( $url ) . \'" title="\' . esc_attr( $value ) . \'">\' . $value . \'</a>\';
                array_push( $new_values, $val );
            } else {
                array_push( $new_values, $value );
            }
        } else {
            $matched = preg_match_all( "/\\[([^\\]]+)\\]\\(([^)]+)\\)/", $value, $matches );

            if ( $matched && count( $matches ) == 3 ) {
                $val = \'<a href="\' . esc_url( $matches[2][0] ) . \'" title="\' . esc_attr( $matches[1][0] ) . \'">\' . sanitize_text_field( $matches[1][0] ) . \'</a>\';
                array_push( $new_values, $val );
            } else {
                array_push( $new_values, $value );
            }
        }
    }

    $text = implode( \', \', $new_values );

    return $text;
}
我将cutom属性值添加为:[Displayed text](https://expected-display-url.com)

我期望它输出的内容:

<a href="https://expected-display-url.com">Displayed text</a> 
但它转换了什么:

<a title="Displayed text">Displayed text</a> 
即使我尝试添加特定的标题值,如:[Displayed text](https://expected-display-url.com "title")

它始终呈现为:<a title="Displayed text">Displayed text</a>

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

在当前的WooCommerce版本中,请尝试此操作,而不是make_product_atts_linkable() 问题中的功能:

function make_product_atts_linkable( $text, $attribute, $values ) {
    $vals = array();

    if ( $attribute->is_taxonomy() ) {
        foreach ( $attribute->get_options() as $i => $id ) {
            if ( $url = get_term_meta( $id, \'attribute_url\', true ) ) {
                $vals[] = \'<a href="\' . esc_url( $url ) . \'">\' . esc_html( get_term_field( \'name\', $id ) ) . \'</a>\';
            } else {
                $vals[] = $values[ $i ];
            }
        }
    } else {
        foreach ( $attribute->get_options() as $value ) {
            $vals[] = preg_replace_callback( \'/\\[([^\\]]+)\\]\\(([^) ]+)(?: "([^"]+)"|)\\)/\', function ( $matches ) {
                $title = ( ! empty( $matches[3] ) ) ? \' title="\' . esc_attr( $matches[3] ) . \'"\' : \'\';
                return \'<a href="\' . esc_url( $matches[2] ) . \'"\' . $title . \'>\' . esc_html( $matches[1] ) . \'</a>\';
            }, $value );
        }
    }

    return wpautop( wptexturize( implode( \', \', $vals ) ) );
    //return implode( \', \', $vals ); // Use this or the above. Up to you..
}

相关推荐

Functions.php上未定义$_GET和&_REQUEST索引

我最近尝试学习为我的自定义主题创建一个主题选项页面,这是按照stackoverflow和其他资源的教程进行的。但脚本显示错误if ($_GET[\'page\'] == basename(__FILE__)) { if (\'save\' == $_REQUEST[\'formaction\']) { foreach ($options as $value) { if( isset( $_REQUEST[ $value[\'id\']