2011-01-26 9 views
7

Tengo un módulo personalizado que implementa hook nodeapi para ejecutar algún código cuando se crea o actualiza el nodo.Drupal: ¿Cómo creo programáticamente un alias de URL para un nodo que ya tiene un alias en el nodo de guardar?

Básicamente quiero crear un alias basado en el alias generado automáticamente en el nodo de guardar o actualizar.

Ahora estoy usando una llamada a path_set_alias y solo quiero hacer esto con un tipo específico de contenido, "producto".

Aquí es mi llamada nodeapi ayuda para empezar

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; 
} 

Entonces tengo esta función, el que estoy tratando de llegar a salvar mi segundo alias de URL para mí.

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>"); 
} 

Esto no establece el alias, solo crea un duplicado del alias original del producto. Entonces, si comencé con mi producto siendo "Green Fern". Me gustaría guardarlo, y usaría pathauto para generar productos/green-fern luego de llamar a mi código de módulo y crear un alias "alt/products/green-fern" y aún así hacer que apunte a la ruta "node/nid" .

Sin embargo, cuando ejecuto este código, se crea un duplicado en la base de datos. Así que guardo Green Fern una vez y, de repente, veo dos registros duplicados al final de las url_alias en la base de datos. "products/green-fern" y "products/green-fern"

Siento que estoy pensando en esto de una manera demasiado comlpex. Mi cliente es consciente del éxito SEO que obtienen al hacer más de un punto de alias para el mismo nodo, solo quieren que haga esto. ¡Halp!

Respuesta

0

Está estableciendo explícitamente el pid en 0 en el código. Me imagino que el segundo nodo para el que corre este código devolverá un error. Intenta cambiar 0 a NULL en tu llamada path_set_alias().

1

Difícil de decir qué tan complejo le gustaría que sean los alias, pero el módulo pathauto parece que sería una solución simple a su problema. Le permite generar alias automáticamente en función de los tokens.

Como bonificación, se coloca muy bien con el módulo path_redirect, que establecerá 303 redireccionamientos (o el redireccionamiento que desee) en alias duplicados. Esto mitigará un poco sus preocupaciones SEO.

Editar:

¿Está requete seguro de que su código no editado está llamando a las funciones correctamente? Las secciones pertinentes de path_set_alias son:

if ($pid) { 
    // An existing alias. 
    // *** You set pid to 0, so this doesn't fire *** 
    } 
    else if ($path && $alias) { 
    // Check for existing aliases. 
    if ($alias == drupal_get_path_alias($path, $language)) { 
     // There is already such an alias, neutral or in this language. 
     // Update the alias based on alias; setting the language if not yet done. 
     db_query("UPDATE {url_alias} SET src = '%s', dst = '%s', language = '%s' WHERE dst = '%s'", $path, $alias, $language, $alias); 
    } 
    else { 
     // A new alias. Add it to the database. 
     // *** If your code is correct, this is the part that should fire. *** 
     db_query("INSERT INTO {url_alias} (src, dst, language) VALUES ('%s', '%s', '%s')", $path, $alias, $language); 
    } 
    } 

Si está trabajando en un sitio de prueba, también se podría tratar de dejar caer un poco dpm() s justo antes de las db_query s en node.module para averiguar qué secciones del código son en realidad disparando, y qué datos están entrando en ellos.

+0

Err, acabo de notar que ya está usando pathauto - editando mi respuesta ... – anschauung

5

JR, mejorando su código en Drupal7, los db_querys son caros.Una mejor manera podría estar utilizando la función lookup_path Drupal:

$urlAlias = drupal_lookup_path('alias',"node/".$node->nid . '/prices'); 

si urlAlias ​​no tiene valor, entonces no hay alias de esta URL, por lo que puede crear de forma segura:

if(urlAlias == '') 
path_set_alias($default_node_path, $alternate_url, 0, ''); 
+7

por cierto, en drupal7 deberíamos cambiar path_set_alias con path_save ($ args = array ("fuente" => $ non_alias_path, " alias "=> $ new_aliased_url);) –

2

Pathauto es detectar duplicar alias para el nodo y sobrescribir el personalizado con el patrón de tipo de contenido predeterminado. De forma predeterminada, pathauto creará un nuevo alias y eliminará uno anterior cuando se realice una acción de actualización.

Si cambia la opción Actualizar acción a "Crear un nuevo alias. Deje el alias existente funcionando" en la pantalla del administrador, /admin/config/search/path/settings, no sobrescribirá el alias personalizado.

Cuestiones relacionadas