Drupal: Comment puis-je en programmant de créer une URL alias pour un nœud qui possède déjà un alias sur le nœud enregistrer?
J'ai un module personnalisé qui implémente crochet nodeapi d'exécuter du code lorsque le nœud est créé ou mis à jour.
Fondamentalement, je veux créer un alias basé sur de l'alias généré automatiquement sur le nœud d'enregistrer ou de mise à jour.
Maintenant je suis en utilisant un appel à path_set_alias et je ne veux le faire avec un type de contenu spécifique, le "produit".
Voici mon nodeapi appeler pour me faire
function product_url_helper_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if($node->type == 'product'){
switch($op){
case 'insert':
_create_alternate_url($node);
break;
case 'update':
_create_alternate_url($node);
break;
case 'view':
//do nothing
break;
default:
break;
}
}
return;
}
Puis-je avoir cette fonction, celui que j'essaie de faire pour enregistrer mon deuxième URL alias pour moi.
function _create_alternate_url($node){
$aliasExists = db_fetch_object(db_query("SELECT count(dst) as total FROM {url_alias} WHERE dst = 'alternate/".$node->path."'"));
if($aliasExists->total == 0){
$product_url = $node->path;
$alternate_url = "alt/" . $node->path;
$default_node_path = "node/" . $node->nid;
path_set_alias($default_node_path, $alternate_url, 0, '');
drupal_set_message("Created Alternate path for Product: " . $node->title . " <br/> Path <a href='/" . $default_node_path ."'>" . $default_node_path . "</a> is now aliased by <a href='/" . $alternate_url . "'>". $alternate_url ."</a>");
}
Ce n'est pas de définir l'alias si, il crée une copie de l'original du produit alias. Donc, Si j'ai commencé avec mon produit "Vert Fougère". Je veux sauver, et elle serait d'utiliser pathauto pour générer des produits/vert-fougère puis, après appel à mon module de code et de faire un alias "alt/produits/vert-fougère" et font toujours du point de retour pour le "node/nid" chemin d'accès.
Cependant, lorsque j'exécute ce code un doublon dans la base de données est créée. J'ai donc enregistrer Vert Fougère en une fois, et tout d'un coup, je vois deux enregistrements en double à la fin de la url_alias dans la base de données. "produits/vert-fougère" et les "produits/vert-fougère"
J'ai l'impression que je suis en train de penser à ce sujet dans une beaucoup trop comlpex. Mon client est conscient de la SEO coup qu'ils obtiennent lors de la prise de plus d'un alias pointer vers le même nœud, ils ont juste envie de le faire. Halp!
OriginalL'auteur JR. | 2011-01-26
Vous devez vous connecter pour publier un commentaire.
JR, l'amélioration de votre code dans Drupal7, le db_querys sont chers. Une meilleure façon pourrait être à l'aide de la lookup_path drupal fonction:
si urlAlias n'a pas de valeur, alors il n'y a pas d'alias pour cette url, afin que nous puissions créer:
OriginalL'auteur Alejandro Moreno
Pathauto est de détecter les alias en double pour le nœud et d'écraser le personnalisé avec le type de contenu par défaut de motif. Par défaut, pathauto permettra de créer un nouvel alias et de supprimer un ancien lorsqu'une mise à jour des mesures sont prises.
Si vous passez à l'action de mise à Jour option "Créer un nouvel alias. Laissez le alias de fonctionnement" sur l'écran admin,
/admin/config/search/path/settings
, il ne remplace pas la coutume alias.OriginalL'auteur Louis J
Difficile de dire à quel degré de complexité que vous aimeriez les alias, mais le
pathauto
module semble que c'est une solution simple à votre problème. Il permet de générer automatiquement des alias basée sur les jetons.Comme un bonus, elle accorde parfaitement avec le
path_redirect
module, qui va 303 redirections (ou quel que soit rediriger vous le souhaitez) sur alias en double. Cela permettra de réduire votre RÉFÉRENCEMENT des préoccupations un peu.Edit:
Êtes-vous super-duper assurez-vous que votre non expurgés code appelant les fonctions correctement?
Les sections pertinentes de
path_set_alias
sont:Si vous travaillez sur un site de test, vous pouvez aussi essayez de laisser tomber certains
dpm()
s juste avant ledb_query
s dansnode.module
pour savoir ce que les articles du code sont fait de tir, et les données qui se passe en eux.OriginalL'auteur anschauung
Vous de définir explicitement le pid de 0 dans le code. J'imagine que le deuxième nœud de l'exécution de ce code pour renvoyait une erreur. Essayez de changer de 0 à la valeur NULL dans votre
path_set_alias()
appel.OriginalL'auteur mirzu