Añadir rel=»nofollow» a los links de TinyMCE 4 con PHP

En TinyMce v3 existía una plugin llamado advlink (Advanced Link) que permitía indicar si se quería insertar el valor nofollow al atributo rel de un link.

Si habéis llegado aquí ya sabéis para que sirve el valor rel=nofollow de un link, en todo caso, por si alguien no lo tuviera claro, rel=nofollow le dice a los buscadores que no sigan ese link, que no es relevante y de esa manera no reparta parte de la «autoridad» de tu web con la web enlazada. Luego obviamente, Google hará lo que le venga en gana, aunque la teoría es esta.

Al grano, con TinyMce v4, la versión actual (hay un TinyMce v5 descargable pero aun en fase de desarrollo) este plugin desapareció. Ahora por motivos de seguridad, TinyMce introduce rel=noopener por defecto si indicas que el link se abra en una nueva ventana, ya sabéis, el target=_blank de toda la vida. Esta inclusión es positiva, pues evita que una url maliciosa tome el control de la pestaña que la llamo.

Dado que actualmente no hay disponible el plugin que nos permitía introducir nofollow manualmente, he creado una función en PHP que recoge el valor html que genera TinyMce y le introduce el nofollow, para ya después hacer lo que se quiera con el contenido html modificado, normalmente grabarlo en una base de datos.

Función php para introducir rel=»nofollow» en enlaces.

Esta función recibe el código HTML que genera TinyMce e introduce nofollow en todos los enlaces.


    /**
     * Inserta nofollow a los links de un fragmento de codigo html.
     * @param String $html
     * @return String
     */
    public static function no_follow_links($html) {
        
        $doc = new DOMDocument();
        $doc->loadHTML($html);
        
        // El objeto DomDocument se genera con los tags html y body
        // Seleccionamos el 1er hijo de que es
        $first_node = $doc->documentElement->childNodes->item(0); 
        
        // Obtenemos todos los links
        $links = $doc->getElementsByTagName('a');
        
        
        foreach ($links as $link) {
            
            $hasrel = false;
            foreach ($link->attributes as $attr) {
             
                if($attr->name == "rel") {
                    $hasrel = true;
                    $attr->value = "noopener nofollow";
                }
            }
            
            if(!$hasrel) {
                // Añadimos el atributo rel al link (que no lo tenía).
                $domAttribute = $doc->createAttribute('rel');
                $domAttribute->value = 'nofollow';
                $link->appendChild($domAttribute);
            }
        }
        
        // Pasamos a texto el documento HTML modificado.
        $res = $doc->saveHTML($first_node);
        
        // Eliminamos la etiqueta body del resultado.
        $res = str_replace(["<body>", "</body>"], "", $res);
        
        return $res;
    }

386 visitas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *