質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.35%

phpでのエラーメッセージの解釈

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 672

score 8

前提・実現したいこと

$product->get_dollPrice_html()の値を1.2で割りたい。そこでwc_get_price_to_displayの連想配列に'price'を1.2で割った'dollPrice' => $dollPriceを追加して解決しようと試みた。

発生している問題・エラーメッセージ

自分で作った$product->get_dollPrice_html()(詳細は該当のコードエリアにて)で出力した結果が、既存の$product->get_price_html()で出力した結果と変わらない。

試したこと

get_price_html()を見てみると以下の記述があった。

public function get_price_html( $deprecated = '' ) {
        if ( '' === $this->get_price() ) {
            $price = apply_filters( 'woocommerce_empty_price_html', '', $this );
        } elseif ( $this->is_on_sale() ) {
            $price = wc_format_sale_price( wc_get_price_to_display( $this, array( 'price' => $this->get_regular_price() ) ), wc_get_price_to_display( $this ) ) . $this->get_price_suffix();
        } else {
            $price = wc_price( wc_get_price_to_display( $this ) ) . $this->get_price_suffix();
        }

        return apply_filters( 'woocommerce_get_price_html', $price, $this );
    }


自分の状況はelseの場合のみしかないのでwc_price()とwc_get_price_to_display()のみを考え、それらの内容は以下の通りだった。

function wc_price( $price, $args = array() ) {
  $args = apply_filters(
    'wc_price_args',
    wp_parse_args(
      $args,
      array(
        'ex_tax_label'       => false,
        'currency'           => '',
        'decimal_separator'  => wc_get_price_decimal_separator(),
        'thousand_separator' => wc_get_price_thousand_separator(),
        'decimals'           => wc_get_price_decimals(),
        'price_format'       => get_woocommerce_price_format(),
      )
    )
  );

  $unformatted_price = $price;
  $negative          = $price < 0;
  $price             = apply_filters( 'raw_woocommerce_price', floatval( $negative ? $price * -1 : $price ) );
  $price             = apply_filters( 'formatted_woocommerce_price', number_format( $price, $args['decimals'], $args['decimal_separator'], $args['thousand_separator'] ), $price, $args['decimals'], $args['decimal_separator'], $args['thousand_separator'] );

  if ( apply_filters( 'woocommerce_price_trim_zeros', false ) && $args['decimals'] > 0 ) {
    $price = wc_trim_zeros( $price );
  }

  $formatted_price = ( $negative ? '-' : '' ) . sprintf( $args['price_format'], '<span class="woocommerce-Price-currencySymbol">' . get_woocommerce_currency_symbol( $args['currency'] ) . '</span>', $price );
  $return          = '<span class="woocommerce-Price-amount amount">' . $formatted_price . '</span>';

  if ( $args['ex_tax_label'] && wc_tax_enabled() ) {
    $return .= ' <small class="woocommerce-Price-taxLabel tax_label">' . WC()->countries->ex_tax_or_vat() . '</small>';
  }


/**
 * Filters the string of price markup.
 *
 * @param string $return            Price HTML markup.
 * @param string $price             Formatted price.
 * @param array  $args              Pass on the args.
 * @param float  $unformatted_price Price as float to allow plugins custom formatting. Since 3.2.0.
 */
  return apply_filters( 'wc_price', $return, $price, $args, $unformatted_price );
}
function wc_get_price_to_display( $product, $args = array() ) {
    $args = wp_parse_args(
        $args,
        array(
            'qty'   => 1,
            'price' => $product->get_price(),

        )
    );
    $price = $args['price'];
    $qty   = $args['qty'];

    return 'incl' === get_option( 'woocommerce_tax_display_shop' ) ?
        wc_get_price_including_tax(
            $product,
            array(
                'qty'   => $qty,
                'price' => $price,

            )
        ) :
        wc_get_price_excluding_tax(
            $product,
            array(
                'qty'   => $qty,
                'price' => $price,

            )
        );
}

該当のソースコード

新たに自分で作ったget_dollPrice_html()のコード

public function get_dollPrice_html( $deprecated = '' ) {
         if ( '' === $this->get_price() ) {
             $dollPrice = apply_filters( 'woocommerce_empty_price_html', '', $this );
         } elseif ( $this->is_on_sale() ) {
             $dollPprice = wc_format_sale_price( wc_get_price_to_display( $this, array( 'price' => $this->get_regular_price() ) ), wc_get_price_to_display( $this ) ) . $this->get_price_suffix();
         } else {
             $dollPrice = wc_price( wc_get_price_to_display( $this ) ) . $this->get_price_suffix();
         }

         return apply_filters( 'woocommerce_get_price_html', $dollPrice, $this );
     }

改変したwc_get_price_to_display()

function wc_get_price_to_display( $product, $args = array() ) {
    $args = wp_parse_args(
        $args,
        array(
            'qty'   => 1,
            'price' => $product->get_price(),
            'dollPrice' =>intval($product->get_price()) / 1.2,
        )
    );
    $price = $args['price'];
    $qty   = $args['qty'];
        $dollPrice = $arg['dollPrice'];

    return 'incl' === get_option( 'woocommerce_tax_display_shop' ) ?
        wc_get_price_including_tax(
            $product,
            array(
                'qty'   => $qty,
                'price' => $price,
                'dollPrice' => $dollPrice,
            )
        ) :
        wc_get_price_excluding_tax(
            $product,
            array(
                'qty'   => $qty,
                'price' => $price,
                'dollPrice' => $dollPrice,
            )
        );
}


お手数ですがご教示いただけましたら幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2019/09/24 14:55

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

+2

この手のエラーは32行目じゃなければ31行目を疑うとよいのですが
複数行を突っ込んでいてわかりづらいです

<p class="<?php
echo esc_attr( apply_filters( 'woocommerce_product_price_class', 'price' ) );
?>"><?php
echo $product->get_price_html();
echo get($product->get_price_html());
?></p>


のような行を分けて見るとわかりやすくなります。
もしくは

printf('<p class="%s">%s%s</pa>',
esc_attr( apply_filters( 'woocommerce_product_price_class', 'price' ) ),
$product->get_price_html(),
get($product->get_price_html())
);


のような処理でもよいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/24 13:21

    get_price_htmlが何か引数をうけるんじゃないですか?

    キャンセル

  • 2019/09/24 13:31

    恥ずかしながら今引数を受けると0になるのを知りました。
    只今ファイルを確認してまいります。

    キャンセル

  • 2019/09/24 13:59 編集

    yambejp様のおっしゃる通り、引数を受けておりました。
    public function get_price_html( $deprecated = '' ) {
    if ( '' === $this->get_price() ) {
    $price = apply_filters( 'woocommerce_empty_price_html', '', $this );
    } elseif ( $this->is_on_sale() ) {
    $price = wc_format_sale_price( wc_get_price_to_display( $this, array( 'price' => $this->get_regular_price() ) ), wc_get_price_to_display( $this ) ) . $this->get_price_suffix();
    } else {
    $price = wc_price( wc_get_price_to_display( $this ) ) . $this->get_price_suffix();
    }

    return apply_filters( 'woocommerce_get_price_html', $price, $this );
    }
    この場合どのようにすれば$product->get_price_html()で得た値に1.2をかけて出力するという関数を設定できますでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る