نوفالو لینک خارجی در php

در php  باید توجه داشته باشید که اگر صفحه ای با قصد لینک خارجی دادن طراحی شده باید لینک ها نو فالو باشد برای نوفالو کردن لینک های خارجی در php با استفاده از DOMDocument می شود

بهزاد میرزازاده بهزاد میرزازاده

زمان مطالعه

3 دقیقه

بازدید

302

پرسش و پاسخ

0
نوفالو لینک خارجی در php

پس وقتی اطلاعات را از دیتابیس واکشی می کنیم و می خواهیم مطالب را به کاربر نشان دهیم با یک تابع در php این کار را می کنیم. البته پیشنهاد ما این است که در هنگام ذخیره کردن مطلب در دیتابیس این کار را انجام دهید و هزینه (درصد استفاده از cpu) را کاهش دهید چرا ؟ با فرض اینکه سایت شما 1000 کاربر فعال دارد و هرکدام هر مقاله ای از سایت که این تابع را برای nofollow  کردن لینک ها انجام می دهد را اجرا کند خوب چه سربار سنگینی به سرور وارد می شود!!!

این کار را شما می توانید به صورت سه روش ذیل انجام دهید:

  • جستجو و replace کردن در خود دیتابیس با اتفاق افتادن یک رویداد با استفاده از پروسیجر
  • replace کردن قبل از ثبت با استفاده از php
  • replace کردن در هنگام نمایش با php

ما فعلا nofollow کردن با php  هنگام نمایش مطلب رو در این مطلب توضیح خواهیم داد. ما پیش فرض فکر می کنیم که شما یک کلاس دارید که برای نمایش پست ها مورد استفاده قرار میگیرد پس توابع ذیل رو بهش اضافه می کنیم (البته می توانید از توابع static استفاده کنید که در تمام قسمت ها راحت بتونید استفاده کنید)

مراحل کار در کلا:

  • در کلاس مورد نظرمون تابع getRootDomain رو اضافه می کنیم این تابع برای تشخیص لینک های داخل مطلب هستش که آیا لینک جزو لینک های داخلی خود سایتمون هست یا یک لینک خارجی؟
public function getRootDomain($url)
    {
        if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
            $url = "http://" . $url;
        }
        return implode('.', array_slice(explode('.', parse_url($url, PHP_URL_HOST)), -2));
    }
  • باز در کلاس مورد نظر تابع اصلی رو درست می کنیم که متن رو replace کنیم
 public function Nofollow($text)
    {
        $domains = array('jobteam.ir');
        $dom= new \DOMDocument();
        $dom->loadHTML('<?xml encoding="utf-8" ?>' .$text);
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        foreach ($dom->getElementsByTagName('a') as $link) {
            $href = $link->getAttribute('href');
            if (!in_array(self::getRootDomain($href), $domains)) {
                $link->setAttribute('rel', 'nofollow');
            }
        }
        return $dom->saveHTML();
    }

کلاس DOMDocument که داخل تایع nofollow هستش پیش فرض در php موجود می باشد و نیازی به نصب ندارد. بعد از اتمام کار در نمایش پست متنی که می خواهید لینک های خارجی آن به صورت nofollow شود را قبل چاپ به تابع nofollow پاس دهید. نحوه استفاده به صورت ذیل

echo Nofollow($query->text)