Добавить шорткод и разделить на PHP вывод на новый шорткод - PullRequest
1 голос
/ 13 февраля 2020

Это текущий HTML, но я хотел бы создать шорткод для отображения всего этого ...

<div class="widget" sp-sku="sku-value-goes-here"></div> 

Я установил шорткод, который получит SKU

function wc_get_product_sku() { 
    global $product;
    echo $product->get_sku();
add_shortcode('product_sku', 'wc_get_product_sku'); 

Но я бы хотел, чтобы новый шорткод выводил весь div с шорткодом или sku в классе div.

1 Ответ

1 голос
/ 13 февраля 2020

Go вперед и взгляните на документацию WordPress Shortcode . Шорткод, который у вас есть сейчас , неправильный. Шорткоды WordPress должны return значение, а не echo или иным образом не выводить его. Если вы видите операторы echo в функции шорткода, обычно они включают Выходная буферизация и возвращают окончательное значение. (у вас также есть синтаксическая ошибка)

Ниже будет правильный способ реализации вашей текущей функции:

add_shortcode('product_sku', 'wc_get_product_sku'); 
function wc_get_product_sku() { 
    global $product;

    return $product->get_sku();
}

Если вы хотите вывести HTML, просто включите его в возвращаемое значение. Если вам нужна другая функция:

add_shortcode( 'product_sku_div', 'wc_product_sku_div'); 
function wc_product_sku_div() { 
    global $product;

    return sprintf( '<div class="widget" sp-sku="%s"></div>', $product->get_sku() );
}

В качестве альтернативы, вы можете добавить их к той же функции и использовать атрибуты шорткода , чтобы определить, выводить ли весь HTML или только SKU, что-то вроде этого:

add_shortcode( 'wc_get_product_sku', 'wc_get_product_sku_function'); 
function wc_get_product_sku_function( $atts ) { 
    global $product;
    $sku = $product->get_sku();

    extract( shortcode_atts( array(
        'wrap' => false,
    ), $atts, 'wc_get_product_sku' ) );

    return ($wrap == true) ? sprintf( '<div class="widget" sp-sku="%s"></div>', $sku ) : $sku;
}

Это означает, что вы используете [wc_get_product_sku] или [wc_get_product_sku wrap="false"] для получения только sku и [wc_get_product_sku wrap="true"] для получения всего HTML.

Редактировать : чтобы проверить sku, просто оберните оператор return в if / else:

add_shortcode( 'product_sku_div', 'wc_product_sku_div'); 
function wc_product_sku_div() { 
    global $product;

    if( $product && !empty( $product->get_sku() ) ){
        return sprintf( '<div class="widget" sp-sku="%s"></div>', $product->get_sku() );    
    } else {
        return '<div>NO SKU FOUND</div>';
    }
}
...