正在尝试让wp_get_attachment_url输出可点击的链接

时间:2019-05-09 作者:Mark Rogers

温柔点,我是新来的(刚从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">&nbsp;</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">&nbsp;</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;

    }


}
}

2 个回复
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>
这对我来说似乎是正确的输出,但你问这个问题是因为输出对你来说不正确

您是否可以使用呈现的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>&nbsp;<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() 在左侧字段中。

SO网友:Stephan Samuel

我之前的回答没有帮助。让我以一种不同的方式来处理这一问题,这可能对将来的某个人有所帮助。

You\'re coming from Joomla. 自从我使用它以来,它已经存在很久了,但谷歌告诉我它是基于PHP的。WP有点面向对象,但我看到的非面向对象插件比面向对象插件多。

所以你已经有了PHP的基础。

A filter 是一种允许您在运行时修改内容的东西。过滤器名称短暂但核心uses a whole bunch of them. 您可以使用add_filter() 具有优先级和多个参数。过滤器的返回值始终应与第一个参数的类型相同,从而使其余参数成为过滤器工作方式的修饰符。此外,如果调用筛选器(使用apply_filters()) 并且没有定义过滤器,它只会返回您的论点。add_action() 执行相同的操作,但不返回值(PHP void)。

The wp_posts table 包含内容。一些CMS系统的做法有所不同,但许多系统只是使用这样一个大的平板。这个post_type 专栏会告诉你这是什么样的帖子post (名称的重复使用)作为博客和page 成为头版。你可以define custom post types. 有关帖子的其他元数据存储在wp_postmeta, 使用post ID。

(表格带有前缀,而您的前缀可能不是wp_. 后缀相同。)

wp_get_attachment_url() takes a post ID 并返回post_type attachment 这与那篇文章有关。(因此,attachment 是另一种核心职位类型。)它只返回URL,不返回链接。如果你想要一个链接,你必须使用wp_get_attachment_link() 或者自己绘制链接。是这样的:

?>
    <a href="<?php echo wp_get_attachment_link($id); ?>">link text</a>
<?php
我不确定哪些变量包含post ID,哪些变量包含要显示的文本。这是基于WooCommerce的建立方式。在WC(看起来你好像在欧洲,所以请原谅缩写),产品存储为贴子。我忘了确切的数字post_type 而且我手边没有WC设置。因此,您可能正在寻找产品的post ID。

You can use direct database access 使用the wpdb class 但你“应该”的方式是the WP_Query class. 用如下数组实例化一个:

$query = new WP_Query(array(\'post_type\' => \'product\', \'nopaging\' => true));
然后使用$query->posts 获取匹配记录的数组。

The helper functions esc_html()esc_attr() 分别为元素内容和属性的输出转义文本。esc_url() 是相似的。与任何其他CMS一样,永远不要信任来自用户(甚至是管理员)或数据库的任何内容。这些函数可以帮助您包装它。

You can debug 使用printf(). print_r() 适用于阵列和对象。我更喜欢var_export($object, true) 因为它总是能打印出所有的东西。如果您可以设置PHP日志,error_log() 效果很好(我就是这么用的)。我从来没有找到一个IDE能够真正帮助我很好地调试。

话虽如此,您正在将数据转储到HTML表中。找出(使用一些调试方法)您的帖子ID是什么,以及要显示的文本。然后使用wp_get_attachment_url() 使用帖子ID获取要显示的图像的URL。如果$id 具有post ID和$linktext 有链接文本,请执行以下操作:

echo \'<a href="\' . esc_attr(wp_get_attachment_url($id)) . \'">\' . $linktext . \'</a>\';
把它放在<th><td> 你会得到一个可点击的链接。如果要显示图像,请执行以下操作:

echo \'<img src="\' . esc_attr(wp_get_attachment_url($id)) . \'" />\';
希望,在那里的某个地方,有你所需要的一切来让这个工作。