1

過去数日間解決しようとしてきたこの問題について、誰かが私を助けてくれることを願っています。Magento のレイヤード ナビゲーションを検索エンジンから完全に隠したいが、ユーザーは利用できるようにしたい。SEO 上の理由から、すべてのリンクを NoFollowing にしたり、noindex フォロー メタ タグを使用したり、Robots.txt で完全にブロックしたりすることで妥協したくありません。これを処理する最も効果的な方法は、Google は Cookie を使用しないため、Cookie が有効になっているユーザーにのみ階層化されたナビゲーションを表示することです。おそらく JavaScript でも同じ効果が得られるでしょうが、私は Cookie メソッドを選択しました。

これまでのところ、ページが読み込まれた後に Cookie が有効になっているかどうかを確認するために、JS の大まかな部分を実装することができました (このフォーラムの別のスレッドから適応)。Cookie が有効になっている場合は何もせず、階層化されたナビゲーションが表示されますが、Cookie が有効でない場合は、「catalog.leftnav」ブロックを削除したいと考えています。私のJSスクリプトからこれを行う方法を理解することはできません。私が達成できたのは、div要素を削除するか、style.displayをnoneに設定することだけです。これらの手法はすべてフロントエンドからリンクを削除しますが、Googleはそれらをすべて見ることができます. これまでに template/catalog/layer/filter.phtml にあるコードの例を次に示します。

<div id="shop-by-filters">
  <ol>
    <?php foreach ($this->getItems() as $_item): ?>
    <li>
    <?php if ($_item->getCount() > 0): ?>
    <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>" rel="nofollow"><?php echo $_item->getLabel() ?></a>
    <?php else: echo $_item->getLabel() ?>
    <?php endif; ?>
    <?php if ($this->shouldDisplayProductCount()): ?>
    (<?php echo $_item->getCount() ?>)
    <?php endif; ?>
    </li>
    <?php endforeach ?>
  </ol>
</div>

<script type="text/javascript">
if (navigator.cookieEnabled) {
    return true; 
} else if (navigator.cookieEnabled === undefined) {
    document.cookie = "testcookie";
    if (cookie_present("testcookie"))
        return true;   
} else {
var elem = document.getElementById('shop-by-filters');
elem.parentNode.removeChild(elem);
}
</script>

誰かがこれを手伝ってくれますか、それとももっと良い方法がありますか? 私はまだ Magento について理解しようとしているので、実装が複雑な場合は、いくつかの指示が必要になる可能性があることを覚えておいてください。

ありがとうございました。

ブレンドン

4

3 に答える 3

0

Google ロボットが JavaScript を確実に解析できるかどうかわかりません。

PHP を使用した現在のセッションに基づいて、階層化されたナビゲーションを非表示にする方がよい場合があります。

<?php if (Mage::getSingleton('customer/session')): ?>
    ...your nav code...
<?php endif ?>
于 2013-03-12T01:17:36.597 に答える
0

まず第一に、JavaScript は、Google がそのコンテンツをインデックスに登録するのを止めることはしません。

「すべてのリンクを NoFollowing で解決」したくないのはなぜですか? それがまさにNoFollowの目的です。ウェブマスター ツールで修飾子やクエリ文字列に注意を払わないように Google に指示することもできます。

なんらかの理由でそのブロックを Google から本当に隠したい場合は、テンプレートを編集し、文字列$_SERVER['HTTP_USER_AGENT']を Google の非常に公開されているユーザー エージェントのリストと比較してください http://support.google.com/webmasters/bin/answer.py?hl=en&answer =1061943

EDIT -- 文字列比較

<?php if (stripos($_SERVER['HTTP_USER_AGENT'], 'Googlebot') !== false): ?>
<div id="shop-by-filters">
  <ol>
    <?php foreach ($this->getItems() as $_item): ?>
    <li>
    <?php if ($_item->getCount() > 0): ?>
    <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>" rel="nofollow"><?php echo $_item->getLabel() ?></a>
    <?php else: echo $_item->getLabel() ?>
    <?php endif; ?>
    <?php if ($this->shouldDisplayProductCount()): ?>
    (<?php echo $_item->getCount() ?>)
    <?php endif; ?>
    </li>
    <?php endforeach ?>
  </ol>
</div>
<?php endif; ?>
于 2013-03-12T01:41:36.987 に答える
0

それは滑らかな主題です。このコードを使用して階層化されたナビゲーションを Google から隠しましたが、それが機能しているかどうかはわかりません...

<div id="filters-no-follow"></div>

<?php
function prepare_for_echo($string) {
$no_br = trim(preg_replace('/\s+/', ' ', $string));
$no_slashes = str_replace('\'', '\\\'', $no_br);
return $no_slashes;
}
?>

<script>
function please_enable_cookies() {
var f = document.getElementById('filters-no-follow');
f.innerHTML = '<div class="no-cookies-error">Enable cookies to choose filters.</div>';
}

function please_load_filters() {
var f = document.getElementById('filters-no-follow');
f.innerHTML = '<?php if ( !empty($filtersHtml) || !empty($stateHtml) ): ?>'
+ '\n<div class="block block-layered-nav">'
+ '\n    <div class="block-title">'
+ '\n        <strong><span><?php echo prepare_for_echo($this->__('Shop By')); ?></span></strong>'
+ '\n    </div>'
+ '\n    <div class="block-content">'
+ '\n        <?php echo prepare_for_echo($this->getStateHtml()); ?>'
+ '\n        <?php if ($this->canShowOptions()): ?>'
+ '\n        <p class="block-subtitle"><?php echo prepare_for_echo($this->__('Shopping Options')); ?></p>'
+ '\n        <dl id="narrow-by-list">'
+ '\n            <?php echo prepare_for_echo($filtersHtml); ?>'
+ '\n        </dl>'
+ '\n        <?php endif; ?>'
+ '\n    </div>'
+ '\n</div>'
+ '\n<?php endif; ?>';
}

function are_cookies_enabled()
{
    var cookieEnabled = (navigator.cookieEnabled) ? true : false;

    if (typeof navigator.cookieEnabled == "undefined" && !cookieEnabled)
    { 
        document.cookie="testcookie";
        cookieEnabled = (document.cookie.indexOf("testcookie") != -1) ? true : false;
    }
    return (cookieEnabled);
}

if(are_cookies_enabled()) {
please_load_filters();
} else {
please_enable_cookies();
}
</script>
于 2013-04-18T23:32:13.070 に答える