バージョン 2.13.5
にて確認しました。TOP_URL などの定数が使えるバージョンならば他でも大丈夫だと思います。

<meta property="og:url" content="http://www.yahoo.co.jp/">
<link rel="canonical" href="http://www.yahoo.co.jp/">

これを自動で出したい。




LC_Page_Ex.php

修正 [2016/02/25] - strpos で調べる値が空だったら PHP の Warning が出ないようにいたしましたm(_ _)m

/**
 * URLを返却
 *
 * @param string 分岐したい mode を入力 ( 'canonical' | 'ogp' )
 * @return string パラメーターが整理された URL を返却
 */
public function customPublishUrl($mode)
{
    $protocol    = ( empty($_SERVER['HTTPS']) ? 'http://' : 'https://');
    $http_host   = $_SERVER['HTTP_HOST'];
    $request_uri = $_SERVER['REQUEST_URI'];
    $script_name = $_SERVER['SCRIPT_NAME'];
    $top_url     = TOP_URL;
    $dynamic_url = $protocol . $http_host . $request_uri;
    $static_url  = $protocol . $http_host . $script_name;

    // 出力用
    $publish_url = $static_url;
    $param_all   = '';

    // URL から 不要なファイル名を調査
    if (
           strpos( $script_name, 'index.php' ) !== false
        || strpos( $script_name, 'confirm.php' ) !== false
        || strpos( $script_name, 'complete.php' ) !== false
       ) :

        // トップページならば
        if ( $static_url === $top_url || $static_url === $top_url . 'index.php' ) :
            $publish_replace = '';
            $publish_search  = '/\/index.php/u';

        // それ以外のページ
        else :
            $publish_replace = '';
            $publish_search  = '/index.php|confirm.php|complete.php/u';
        endif;

        // 不要なファイル名を削除する
        $publish_url = preg_replace($publish_search, $publish_replace, $publish_url);

    endif;

    // パラメーター算出用の URL を綺麗にする
    $clean_url     = $dynamic_url;
    $clean_search  = '/\"(.*)\"|\'(.*)\'|%22(.*)%22/u';
    $clean_replace = '';
    $clean_url     = preg_replace($clean_search, $clean_replace, $clean_url);

    // パラメーターを配列化
    $hatena = explode('?', $clean_url);
    $and = explode('&', $hatena[1]);

    // チェックするパラメーター
    switch ( $mode ) :

        // $check_pattern
        // 'only'   -&gt; URL に含まれるパラメーターを配列だけにする
        // 'remove' -&gt; 配列のパラメーターは不要なので URL から必ず除外する

        case 'canonical' :
            $check_pattern = 'only';
            $check_array   = array('category_id', 'maker_id', 'name', 'product_id');
            break;

        case 'ogp' :
            $check_pattern = 'remove';
            $check_array   = array('transactionid', 'admin');
            break;

    endswitch;

    // $hatena が空で無ければ
    if ( $hatena[1] !== '' ) :

        // パラメーター配列の数だけループ
        foreach ( $and as $each ) :

            $each_split = explode('=', $each);
            $param = $each_split[0];
            $value = $each_split[1];
            $flag = ( $check_pattern === 'only' ) ? false : true;

            // $check_array の数だけループ
            foreach ( $check_array as $each2 ) :

                // strpos で調べる値が空だったら PHP の Warning が出るので事前に $param_all をチェック
                if ( $param_all !== '' ) :

                    // 値の重複を調査( $param_all が $param を含んでいたら フラグを無くす )
                    if ( strpos( $param_all, $param ) !== false ) :
                        $flag = false;
                    endif;

                endif;

            endforeach;

            // 値の重複を調査( $param_all が $param を含んでいたら フラグを無くす )
            if ( strpos( $param_all, $param ) !== false ) :
                $flag = false;
            endif;

            // $flag が true なら $param_all に $each を追加
            if ( $flag ) :
                $param_all .= ( $param_all === '' ) ? '?' . $each : '&' . $each;
            endif;

        endforeach;

    endif;

    // もし $param_all の値が ? だけだったら $param_all を空にする
    $param_all = ( $param_all === '?' ) ? '' : $param_all;

    // ただし $mode が canonical かつ パラメーターに pageno を含んでいたら $publish_url と $param_all を空にする
    if ( $mode === 'canonical' && strpos( $clean_url, 'pageno=' ) !== false ) :
        $publish_url = '';
        $param_all = '';
    endif;

    return $publish_url . $param_all;
}




呼び出し
LC_Page_Ex.php

修正 [2016/02/24] - init() から process() に変更しましたm(_ _)m

/**
 * Page のプロセス.
 *
 * @return void
 */
public function process()
{
    parent::process();

    /**
     * 下記はシステムエラー時無視されるので、
     * ・LC_Page_Error.php
     * ・LC_Page_Error_DispError_Ex.php
     * ・LC_Page_Error_SystemError_Ex.php
     * にて再取得する
     */
    
    // og:url
    $this->custom_ogurl = $this->customPublishUrl('ogp');

    // カノニカルURL
    $this->custom_canonical = $this->customPublishUrl('canonical');
}




LC_Page_Ex.php
だけだとエラー時に空になっちゃうので、
・LC_Page_Error.php
・LC_Page_Error_DispError_Ex.php
・LC_Page_Error_SystemError_Ex.php
でも呼び出す

/**
 * Page のアクション.
 *
 * @return void
 */
function action()
{
    parent::action();

    /**
     * LC_Page_Ex.php にて定義
     */

    // og:url
    $this->custom_ogurl = LC_PAGE_Ex::customPublishUrl('ogp');

    // カノニカルURL
    $this->custom_canonical = LC_PAGE_Ex::customPublishUrl('canonical');
}




出力
site_frame.tpl

<!--{if $custom_canonical|strlen <= 1}--><meta name="robots" content="noindex, follow"><!--{/if}-->
<meta property="og:url" content="<!--{$custom_ogurl|h}-->">
<!--{if $custom_canonical|strlen >= 1}--><link rel="canonical" href="<!--{$custom_canonical|h}-->"><!--{/if}--><!--{strip}-->



最近の SEO 系のブログ記事の傾向を見て、
canonical を出さないようにしているページがあります(ページネーションが発生するページ)。
そこでは、代わりに noindex follow を入れるようにしています。



※ここまで書きましたが、
独自ロジックを EC-CUBE 全体に反映させるにはどこで呼び出したらいいんだろう。
反映箇所が多いと漏れがあると思うし、決済モジュールなどでは、モジュールごとに追記が必要になるので...。
ググっても個々のページ用の情報ばかりなので、よくわかりませんでした。勉強します。