WooCommerce 使产品属性可链接,给产品属性添加上可点击的自定义链接。

  • 该话题包含 0 个回复,1 人参与,最后由诗语 更新于 7 年前
正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 作者
    帖子
  • 诗语
    管理员
    • 文章数量: 5,929
    @feibisi
    楼主

    默认情况下,WooCommerce 将从属性值中剥离所有 HTML,这意味着您不能使用 HTML 锚来使产品属性可链接。尽管使用一些自定义代码,我们仍然可以做到。

    幸运的是,WordPress 现在可以帮助我们在 WordPress 4.4 中引入术语元组。

    
    /**
     * 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;
    }

    将网址添加到您的产品属性
    在 WooCommerce 中,我们有两种类型的产品属性:

    全球产品属性
    本地产品属性
    有什么不同?

    全球产品属性是从产品> 属性创建的,它们是分类法,如产品类别或帖子标签。任何产品都可以使用在此定义的属性,这就是为什么它们是全球性的。

    相反,本地产品属性是在产品中定义的,而在创建/编辑它的属性标签中定义。它们仅在已定义的产品上可用,并且不能被其他产品使用。

    由于这种差异,我们需要使用两种不同的方式将 URL 添加到产品属性字词中。

    在 wp-content / themes / your-child-theme-name /中打开你的 functions.php 文件,并在文件末尾添加下面的代码:

    这段代码做了什么?

    从第 1 行到第 67 行,代码在表单中添加一个名为 URL 的字段,用于创建和编辑全局属性。功能是注册该字段,将其添加到添加新术语表单中,将其添加到编辑术语表单中并保存该字段。

    从第 69 行到文件末尾,它会调整单个产品页面中附加信息选项卡中的值,以处理产品属性项的 URL 。这个函数也处理本地属性的 URL 。

    如何使用产品属性 URL
    对于全局属性,请转至产品> 属性并添加一个新属性,或编辑现有属性。它会出现在右边的表格中。点击齿轮图标添加产品属性条款,你会看到这样的形式:

    如何使用产品属性 URL
    对于全局属性,请转至产品> 属性并添加一个新属性,或编辑现有属性。它会出现在右边的表格中。点击齿轮图标添加产品属性条款,你会看到这样的形式:

    正如您所看到的,表单添加新设计器 (设计器是我用于此示例的属性的名称) 表单的底部有一个新的字段,名为 URL 。在那里写下你想要的产品属性条款链接到的 URL 。

    编辑产品属性字词时可以使用相同的字段:

    对于本地属性,我们没有这样的接口,所以我们必须找到一种解决方法来将 URL 添加到产品属性条款中。

    你知道我喜欢 Markdown 吗?这就是我们要使用的本地属性 Markdown!

    从产品> 所有产品编辑产品,然后打开 「 属性」 选项卡。从这里添加一个新的自定义产品属性。然后给它一个名字并使用 Markdown 添加一些值来创建链接:

    [Text shown](https://myurl.com)

    这是使用的格式。在此屏幕截图中显示了一个示例:

    这里的第一个属性 Logo 是本地属性,第二个属性 Designer 是全局属性。

    现在点击保存属性并发布您的产品。这是它将如何使用主题店面在网站上显示:

    感谢 James 在这篇文章中成为我的榜样。我不能用我的名字,因为称我为设计师是一种耻辱。

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 哎呀,回复话题必需登录。

话题信息

  • 当前位于:WooCommerce
  • 0 条回复
  • 1 个参与人
  • 最后回复:<a href="https://bbs.weixiaoduo.com/users/feibisi/" title=" 查看诗语的个人资料" class="bbp-author-link"><span class="bbp-author-name"> 诗语</span></a>
  • 上次活动:<a href="https://bbs.weixiaoduo.com/topic/25609/" title="WooCommerce 使产品属性可链接,给产品属性添加上可点击的自定义链接。">7 年前</a>