web-dev-qa-db-fra.com

Ouvrir les liens externes dans une nouvelle fenêtre

Est-il possible de faire une sorte de changement ou d'ajouter un plugin qui me permette d'ouvrir chaque lien "externe" dans une nouvelle fenêtre?

Juste un exemple: si mon blog s’appelait http // timmy.com/et que je voulais créer un lien vers http // tom.com /, il ouvrirait une nouvelle fenêtre au lieu de la même fenêtre, mais je voulais créer un lien depuis http//timmy.com/ à http // timmy.com/quelque part/dans la même fenêtre.

Je souhaite donc que tous les liens externes de mon site Web soient redirigés vers un autre dans une nouvelle fenêtre/onglet, mais je souhaite que tous les liens internes, de mon site Web à un autre endroit de mon site Web, se trouvent dans la même fenêtre/onglet.

Est-ce possible?

3
Filuren

Yup peut être fait avec javascript.

var $j = jQuery.noConflict();

$j(document).ready(function() { //external attribute
    $j("a:not([@href*=http://YOURSITE.com/])").not("[href^=#]")
    .addClass("external")
    .attr({ target: "_blank" });
});
3
curtismchale

Bien que vous ayez des réponses techniques à ce sujet, je tiens à préciser la convivialité - vous ne devriez vraiment pas.

Mis à part certains cas spécifiques (documents non basés sur le Web, par exemple), l’ouverture de nouvelles fenêtres/onglets de navigation pour les liens est considérée comme une très mauvaise pratique (et ce depuis très longtemps déjà).

Bien que cela puisse sembler une stratégie de garder votre site ouvert, en fait, il est très probable que cela ennuie les utilisateurs qui ne voulaient pas explicitement ce nouvel onglet, mais qui l’avaient quand même car ils avaient décidé de le faire.

2
Rarst

Eh bien, inutile de réinventer la roue: Plug-in de liens externes pour WordPress , je le recommande vraiment.

1
hakre

Bonjour @ ninjaboi21:

Je vois que @curtismchale vous a fourni une solution jQuery qui devrait bien fonctionner. Si vous souhaitez une solution PHP, voici une solution qui devrait également fonctionner pour vous.

Fondamentalement, la solution se compose de deux parties. La première consiste à mettre en tampon la sortie en utilisant la fonction ob_start() de PHP, ce qui est facile, puis à analyser la sortie dans la fonction de rappel, qui est plus complexe. J'ai utilisé une méthode de force brute pas si élégante; Je suis sûr qu'il existe de meilleures méthodes, mais la méthode de la force brute est celle utilisée par quelqu'un qui n'est pas aussi brillant que moi. :) Peut-être que quelqu'un d'autre viendra avec quelque chose de plus élégant.

Voici le code; mettez ceci dans le fichier functions.php de votre thème et vous devriez être prêt à partir:

add_action('init','buffer_output_for_links');
function buffer_output_for_links() {
  if (!is_admin())  // No need to do in the admin
    ob_start('decorate_links');
}
function decorate_links($content) {
  $wpurl = get_bloginfo('wpurl');
  $parts = explode('<a',$content);
  for($index = 1; $index<count($parts); $index++) {
    // Break apart on '>' to isolate anchor attributes
    $part = explode('>',$parts[$index]);
    // Remove all target="_blank"
    $part[0] = preg_replace("#\\s*target\\s*=\\s*[\"'].*?['\"]\\s*#",' ',$part[0]);
    // Add target="_blank" to all
    $part[0] = preg_replace('#href\s*=\s*#','target="_blank" href=',$part[0]);
    // Remove target="_blank" from only this domain
    $part[0] = preg_replace("#target=\"_blank\" href=(['\"]){$wpurl}#","href=\\1{$wpurl}",$part[0]);
    // End this part by reassembling on the '>'
    $parts[$index] = implode('>',$part);
  }
  // Finally reassembling it all on the '<a' leaving a space for good measure
  $content = implode('<a ',$parts);
  return $content;
}

-Mike Schinkel

0
MikeSchinkel