温柔点,我是新来的(刚从Joomla过来)。
这是数组的一部分。。。
echo \'<tr><th>\' . esc_html( $item_1_title ) . \'</th><td>\' . esc_url( wp_get_attachment_url($row[\'item_code1\']) ) . \'</td></tr>\';
它工作正常,但在前端,输出是纯文本。我似乎不知道如何呈现编码的URL(可单击的链接)。
我应该使用get\\u attachment\\u link还是“image source”?
任何帮助都将受到感激。
谢谢
做记号
。。。。。。。。。
完成php(相关行;203、403、463)
<?php
如果(!defined(\'ABSPATH\'){exit;}
/***Class WC\\u LD\\u Code\\u Assignment**用户购买产品时分配代码*/Class WC\\u LD\\u Code\\u Assignment{
public function setup() {
// assign codes on processing or complete order status
$delivery_order_status = get_option( \'wc_ld_delivery_order_status\' );
$order_status = ( empty( $delivery_order_status ) ? \'completed\' : $delivery_order_status );
add_action( \'woocommerce_order_status_\' . $order_status, array( $this, \'assign_license_codes_to_order\' ), 10, 1 );
add_action( \'woocommerce_order_item_meta_start\', array( $this, \'display_license_codes_in_user_account\' ), 10, 3 );
add_action( \'woocommerce_email_after_order_table\', array( $this, \'email_after_order_table\' ), 100, 4 );
add_filter( "woocommerce_can_reduce_order_stock", array( $this, \'dont_reduce_order_stock\' ), 10, 2 );
add_action( \'woocommerce_order_status_changed\', array( $this, \'manage_stock_for_simple_products\' ), 100, 3 );
}
/**
*
* As we disabled auto stock reduction for all product
* here, we reduce order manually for simple products
*
* @param $order_id
* @param $old_status
* @param $new_status
*
* @return bool
*/
public function manage_stock_for_simple_products( $order_id, $old_status, $new_status ) {
if ( is_object( $order_id ) ) {
$order_id = $order_id->id;
}
// if order stock already reduced
if ( get_post_meta( $order_id, \'_order_stock_reduced\', true ) ) {
return false;
}
if ( $new_status == \'processing\' || $new_status == \'completed\' ) {
// get the order details
$order = new WC_Order( $order_id );
$order_items = $order->get_items();
$reduced = false;
foreach ( $order_items as $item ) {
$qty = $item[\'qty\'];
if ( $item[\'product_id\'] > 0 ) {
$is_license_code = get_post_meta( $item[\'product_id\'], \'_wc_ld_license_code\', true );
if ( empty( $is_license_code ) || $is_license_code == \'no\' ) {
$_product = $order->get_product_from_item( $item );
if ( $_product && $_product->exists() && $_product->managing_stock() ) {
if(version_compare( WC_VERSION, \'3.0.0\', \'>\' )){
$new_stock = wc_update_product_stock($item[\'product_id\'], $qty, \'decrease\' );
}
else{
$new_stock = $_product->reduce_stock( $qty );
}
$item_name = $_product->get_sku() ? $_product->get_sku() : $item[\'product_id\'];
if ( isset( $item[\'variation_id\'] ) && $item[\'variation_id\'] ) {
$order->add_order_note( sprintf( __( \'Item %s variation #%s stock reduced from %s to %s.\', \'highthemes\' ), $item_name, $item[\'variation_id\'], $new_stock + $qty, $new_stock ) );
} else {
$order->add_order_note( sprintf( __( \'Item %s stock reduced from %s to %s.\', \'highthemes\' ), $item_name, $new_stock + $qty, $new_stock ) );
}
if(version_compare( WC_VERSION, \'3.0.0\', \'>\' )){
}
else{
$order->send_stock_notifications( $_product, $new_stock, $item[\'qty\'] );
}
$reduced = true;
}
}
}
}
if ( $reduced ) {
add_post_meta( $order_id, \'_order_stock_reduced\', \'1\', true );
}
}
}
/**
* @return bool
*
* prevent payment proccessing addons to reduce stock. It is done with this plugin
*/
public function dont_reduce_order_stock( $current_value, $order ) {
return false;
}
/**
* @param $order
* @param $sent_to_admin
* @param $plain_text
* @param $email
*
* included the license codes in the order email sent to the user
*/
public function email_after_order_table( $order, $sent_to_admin, $plain_text, $email ) {
if ( is_object( $order ) ) {
$delivery_order_status = get_option( \'wc_ld_delivery_order_status\' );
$order_id = $order->get_id();
$order_status = ( empty( $delivery_order_status ) ? \'completed\' : $delivery_order_status );
if ( $order->get_status() == $order_status ) {
echo $this->get_assigned_codes( $order_id );
}
}
}
/**
* @param $order_id
*
* get the assigned codes to an order
*
* @return string|void
*/
public function get_assigned_codes( $order_id ) {
if ( is_object( $order_id ) ) {
$order_id = $order_id->id;
}
// get the order details
$order = new WC_Order( $order_id );
// check order items to get quantity and product id
$order_items = $order->get_items();
$codes_table = \'\';
foreach ( $order_items as $key => $value ) {
if ( ! isset( $value[\'license_code_ids\'] ) ) {
continue;
}
$license_code_ids = is_array($value[\'license_code_ids\']) ? $value[\'license_code_ids\']: unserialize( $value[\'license_code_ids\'] );
if ( empty( $license_code_ids ) ) {
return;
}
$product_id = (isset($value[\'variation_id\']) && !empty($value[\'variation_id\'])) ? $value[\'variation_id\'] : $value[\'product_id\'];
$rows = WC_LD_Model::get_codes_by_id( implode( ",", $license_code_ids ) );
$code_1_title = WC_LD_Model::get_code_title( 1, $product_id );
$code_2_title = WC_LD_Model::get_code_title( 2, $product_id );
$code_3_title = WC_LD_Model::get_code_title( 3, $product_id );
$code_4_title = WC_LD_Model::get_code_title( 4, $product_id );
$code_5_title = WC_LD_Model::get_code_title( 5, $product_id );
$description = get_post_meta( $value[\'product_id\'], \'_wc_ld_product_code_description\', true );
$codes_table .= \'<h3>\' . $value[\'name\'] . \'</h3>\';
$codes_table .= \'<div style="padding-bottom:20px;">\' . $description . \'</div>\';
foreach ( $rows as $row ) {
$codes_table .= \'<table class="td" cellspacing="0" cellpadding="6" style="margin-bottom:20px;width: 100%; font-family: \\\'Helvetica Neue\\\', Helvetica, Roboto, Arial, sans-serif;" border="1">\';
$codes_table .= \' <tbody>\';
if ( ! empty( $row[\'license_code1\'] ) ) {
$codes_table .= \'<tr><th class="td" scope="col" style="text-align:left;width:40%; background-color:#eeeeee;">\' . esc_html( $code_1_title ) . \'</th><td class="td" scope="col" style="text-align:left;">\' . esc_html( $row[\'license_code1\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code2\'] ) ) {
$codes_table .= \'<tr><th class="td" scope="col" style="text-align:left;">\' . esc_html( $code_2_title ) . \'</th><td class="td" scope="col" style="text-align:left;">\' . esc_html( $row[\'license_code2\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code3\'] ) ) {
$codes_table .= \'<tr><th class="td" scope="col" style="text-align:left;">\' . esc_html( $code_3_title ) . \'</th><td class="td" scope="col" style="text-align:left;">\' . esc_html( $row[\'license_code3\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code4\'] ) ) {
$codes_table .= \'<tr><th class="td" scope="col" style="text-align:left;">\' . esc_html( $code_4_title ) . \'</th><td class="td" scope="col" style="text-align:left;">\' . esc_html( $row[\'license_code4\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code5\'] ) ) {
$codes_table .= \'<tr><th class="td" scope="col" style="text-align:left;">\' . esc_url( wp_get_attachment_url($code_5_title) ) . \'</th><td class="td" scope="col" style="text-align:left;">\' . esc_html( $row[\'license_code5\'] ) . \'</td></tr>\';
}
$codes_table .= \'</tbody></table>\';
}
}
return $codes_table;
}
/**
* @param $order_id
*
* do the license code assignment to order
*/
public function assign_license_codes_to_order( $order_id ) {
global $wpdb;
if ( is_object( $order_id ) ) {
$order_id = $order_id->id;
}
// get the order details
$order = new WC_Order( $order_id );
// check order items to get quantity and product id
$order_items = $order->get_items();
// assign license codes to order items
foreach ( $order_items as $item_id => $item ) {
// if there is no code assigned to this order item
if ( empty( $item[\'license_code_ids\'] ) ) {
// if product has marked as license code product
$is_license_code = get_post_meta( $item[\'product_id\'], \'_wc_ld_license_code\', true );
if ( empty( $is_license_code ) || $is_license_code == \'no\' ) {
continue;
}
$this->assign_license_to_item( $item_id, $item, $order, $order_id );
}
}
}
/**
* @param $item_id
* @param $item
* @param $order
* @param $order_id
*
* does the license assignment for each order item
*/
public function assign_license_to_item( $item_id, $item, $order, $order_id ) {
global $wpdb;
$product_id = (isset($item[\'variation_id\']) && !empty($item[\'variation_id\'])) ? $item[\'variation_id\'] : $item[\'product_id\'];
$qty = $item[\'qty\'];
// get license codes from databse based on requested qty
$rows = $wpdb->get_results( "SELECT * FROM {$wpdb->wc_ld_license_codes}
WHERE product_id = $product_id
AND license_code1 <> \'\'
AND license_status = \'0\'
LIMIT $qty" );
// build an array of license code ids
foreach ( $rows as $query ) {
$license_code_ids[] = $query->id;
}
// only assign license codes if we have the requested quantity of the item
if ( count( $license_code_ids ) == $qty ) {
// save the order id in license codes table
$this->assign_order_id_to_license_codes( $order_id, $license_code_ids );
// save the assigned license codes in order item meta
wc_add_order_item_meta( $item_id, \'_license_code_ids\', $license_code_ids );
// change sold license codes status to sold
WC_LD_Model::change_license_codes_status( implode( $license_code_ids, \',\' ), \'1\' );
// reduce stock
$_product = $order->get_product_from_item( $item );
if ( $_product && $_product->exists() && $_product->managing_stock() ) {
if(version_compare( WC_VERSION, \'3.0.0\', \'>\' ) ){
$new_stock = wc_update_product_stock($product_id , $qty, \'decrease\' );
update_post_meta( $order_id, \'_order_stock_reduced\', \'1\', true );
}
else{
$new_stock = $_product->reduce_stock( $qty );
update_post_meta( $order_id, \'_order_stock_reduced\', \'1\', true );
}
$item_name = $_product->get_sku() ? $_product->get_sku() : $item[\'product_id\'];
if ( isset( $item[\'variation_id\'] ) && $item[\'variation_id\'] ) {
$order->add_order_note( sprintf( __( \'Item %s variation #%s stock reduced from %s to %s.\',
\'highthemes\' ), $item_name, $item[\'variation_id\'], $new_stock + $qty, $new_stock ) );
} else {
$order->add_order_note( sprintf( __( \'Item %s stock reduced from %s to %s.\',
\'highthemes\' ),
$item_name, $new_stock + $qty, $new_stock ) );
}
if(version_compare( WC_VERSION, \'3.0.0\', \'>\' )){
}
else{
$order->send_stock_notifications( $_product, $new_stock, $item[\'qty\'] );
}
}
} else {
$order->add_order_note( sprintf( __( \'Not enough license code available for product <strong>%s</strong>.\',
\'highthemes\' ),
$item[\'name\'] ), 1, false );
}
}
/**
* @param $order_id
* @param $license_code_ids
*
* saves order id into license codes table for later usages
*/
public function assign_order_id_to_license_codes( $order_id, $license_code_ids ) {
global $wpdb;
$wpdb->query( "UPDATE {$wpdb->wc_ld_license_codes} SET order_id=$order_id
WHERE id IN (" . implode( $license_code_ids, \',\' ) . ")" );
}
/**
* @param $item_id
* @param $item
* @param $order
*
* displays the purchased license codes in my account page
*
* @return bool
*/
public function display_license_codes_in_user_account( $item_id, $item, $order ) {
if ( ! is_account_page() && !is_wc_endpoint_url( \'order-received\' ) ) {
return false;
}
if ( empty( $item[\'license_code_ids\'] ) ) {
return false;
}
$license_code_ids = is_array( $item[\'license_code_ids\']) ? $item[\'license_code_ids\']:unserialize( $item[\'license_code_ids\'] );
$rows = WC_LD_Model::get_codes_by_id( implode( ",", $license_code_ids ) );
$product_id = (isset($item[\'variation_id\']) && !empty($item[\'variation_id\'])) ? $item[\'variation_id\'] : $item[\'product_id\'];
$code_1_title = WC_LD_Model::get_code_title( 1, $product_id );
$code_2_title = WC_LD_Model::get_code_title( 2, $product_id );
$code_3_title = WC_LD_Model::get_code_title( 3, $product_id );
$code_4_title = WC_LD_Model::get_code_title( 4, $product_id );
$code_5_title = WC_LD_Model::get_code_title( 5, $product_id );
// checking the user capability
echo \'<table class="license-codes-table" style="width:100%;">\';
echo \' <tbody>\';
foreach ( $rows as $row ) {
echo \'\';
if ( ! empty( $row[\'license_code1\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_1_title ) . \'</th><td>\' . esc_html( $row[\'license_code1\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code2\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_2_title ) . \'</th><td>\' . esc_html( $row[\'license_code2\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code3\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_3_title ) . \'</th><td>\' . esc_html( $row[\'license_code3\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code4\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_4_title ) . \'</th><td>\' . esc_html( $row[\'license_code4\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code5\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_5_title ) . \'</th><td>\' . esc_url( wp_get_attachment_url($row[\'license_code5\']) ) . \'</td></tr>\';
}
echo \'<tr class="order-gap"><td colspan="2"> </td></tr>\';
}
echo \'</tbody></table>\';
}
/**
* @param $item_id
* @param $item
* @param $order
*
* displays the purchased license codes in my account page
*
* @return bool
*/
public function display_license_codes( $item ) {
//echo $this->get_assigned_codes(15);
$license_ids=wc_get_order_item_meta( $item->get_id(), \'_license_code_ids\' );
if ( empty( $license_ids ) ) {
return false;
}
//$license_code_ids=$license_ids;
$license_code_ids = is_array( $license_ids)
? $license_ids
: unserialize( $license_ids );
$rows = WC_LD_Model::get_codes_by_id( implode( ",", $license_code_ids ) );
$product_id = (isset($item[\'variation_id\']) && !empty($item[\'variation_id\'])) ? $item[\'variation_id\'] : $item[\'product_id\'];
$code_1_title = WC_LD_Model::get_code_title( 1, $product_id);
$code_2_title = WC_LD_Model::get_code_title( 2, $product_id );
$code_3_title = WC_LD_Model::get_code_title( 3, $product_id );
$code_4_title = WC_LD_Model::get_code_title( 4, $product_id );
$code_5_title = WC_LD_Model::get_code_title( 5, $product_id );
// checking the user capability
echo \'<table class="license-codes-table" style="width:100%;">\';
echo \' <tbody>\';
foreach ( $rows as $row ) {
echo \'\';
if ( ! empty( $row[\'license_code1\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_1_title ) . \'</th><td>\' . esc_html( $row[\'license_code1\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code2\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_2_title ) . \'</th><td>\' . esc_html( $row[\'license_code2\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code3\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_3_title ) . \'</th><td>\' . esc_html( $row[\'license_code3\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code4\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_4_title ) . \'</th><td>\' . esc_html( $row[\'license_code4\'] ) . \'</td></tr>\';
}
if ( ! empty( $row[\'license_code5\'] ) ) {
echo \'<tr><th>\' . esc_html( $code_5_title ) . \'</th><td>\' . esc_url( wp_get_attachment_url($row[\'license_code5\']) ) . \'</td></tr>\';
}
echo \'<tr class="order-gap"><td colspan="2"> </td></tr>\';
}
echo \'</tbody></table>\';
}
/**
* @param $code
*
* this function used to mask license codes
*
* @return string
*/
public function mask_license_code( $code ) {
if ( is_admin() && ! current_user_can( \'manage_woocommerce\' ) ) {
if ( strlen( $code ) <= 4 ) {
$padsize = 2;
$n = - 2;
} else {
$padsize = strlen( $code ) - 4;
$n = - 4;
}
return str_repeat( \'*\', $padsize ) . substr( $code, $n );
} else {
return $code;
}
}
}
SO网友:Stephan Samuel
你找到答案了。。。
功能,wp_get_attachment_url()
(参见Codex) 只提供URL。您可以将其包装在链接中:
echo \'<tr><td><a href="\' . esc_attr(wp_get_attachment_url($row[\'item_code1\'])) . \'">\' . esc_html($item_1_title) . \'</a></td></tr>\';
或者,您可以使用
wp_get_attachment_link()
(参见
Codex) 正如你提到的:
echo wp_get_attachment_link($row[\'item_code1\'], \'medium\', false, false, esc_html($item_1_title));
这两者都不是一直都好,这取决于你在做什么。
请记住,如果使用上面的第一段代码<a>
标签应具有alt
属性我相信这是为了方便访问。您可以使用包装在esc_attr()
为了这个。
Updated (添加代码模块后)
我已经看过你的代码了。
我一定错过了什么,因为我看不到它在渲染什么<a>
标签。按照你所说的,它们是在前端HTML中呈现的,我不得不猜测,某个地方的某个过滤器正在修改esc_url()
做
查看core code (第4171行),有一个过滤器,clean_url
, 应用于esc_url()
在它回来之前。根据WP的最佳实践,这是一个混乱和糟糕的地方,但我看到过比编辑这样做更糟糕的事情。您可能需要在代码库上进行文本搜索(可能是wp-content/plugins
, 虽然这可能需要很多代码)来查找是否有此筛选器的实例被挂接。我的蜘蛛侠意识告诉我,这不是开始的地方。
我的意思是直截了当的,但我不能完全肯定我理解你说的是错的。我想你的意思是浏览器正在呈现如下内容:
<td>
<a href="http://domain.com/path-to-something">http://domain.com/path-to-something</a>
</td>
这对我来说似乎是正确的输出,但你问这个问题是因为输出对你来说不正确这让我相信我并不完全理解这个问题,因为我不理解将URL粘贴到文本框中的事情。
您是否可以使用呈现的HTML片段和您想要的HTML片段进行编辑?考虑到你发布的代码,我可以试着调和两者,看看发生了什么。
Updated (让我们试试这个)
首先,欢迎使用WordPress。也欢迎来到WP SE。
(你的代码没有在帖子中显示行号,所以请耐心等待。)
在函数中,get_assigned_codes
, 尝试更改此行:
$codes_table .= \'<tr><th class="td" scope="col" style="text-align:left;">\' . esc_url( wp_get_attachment_url($code_5_title) ) . \'</th><td class="td" scope="col" style="text-align:left;">\' . esc_html( $row[\'license_code5\'] ) . \'</td></tr>\';
(这是函数中不是空格或卷曲的倒数第三行):
$codes_table .= \'<tr><th class="td" scope="col" style="text-align:left;"><a href="\' . esc_attr(esc_url(wp_get_attachment_url($code_5_title))) . \'">\' . esc_url(wp_get_attachment_url($code_5_title)) . \'</a></th><td class="td" scope="col" style="text-align:left;">\' . esc_html( $row[\'license_code5\'] ) . \'</td></tr>\';
要查看这是否有效,您必须转到使用该函数的正确位置并比较输出。
似乎还有其他几个地方它在做同样的事情(因此您引用了几个代码行),但让我们试着看一看它做了什么。
如果你这样做,你会得到更多你想要的吗?
Updating (更多信息,但我们正在了解一些情况)
尝试以下操作:
$codes_table .= \'<tr><th class="td" scope="col" style="text-align:left;">\' . esc_url( wp_get_attachment_url($code_5_title) ) . \'</th><td class="td" scope="col" style="text-align:left;"><a href="\' . esc_attr( $row[\'license_code5\'] ) . \'">\' . esc_html($row[\'license_code5\']) . \'</a> <a href="\' . esc_attr(wp_get_attachment_url($row[\'license_code5\'])) . \'">\' . esc_html($row[\'license_code5\']) . \'</a></td></tr>\';
很抱歉,之前的建议不正确。我把零钱放错地方了。
这将在URL字段中打印2个项目。如果其中任何一个是正确的,请删除不正确的一个及其周围的额外内容。而且,您可能不需要wp_get_attachment_url()
在左侧字段中。