ctools drupal

ctools - Drupal: ¿cómo creo programáticamente un alias de URL para un nodo que ya tiene un alias en el nodo de guardar?



pathauto drupal (4)

Está configurando 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() .

Tengo un módulo personalizado que implementa hook nodeapi para ejecutar algún código cuando se crea o actualiza el nodo.

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

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

Aquí está mi llamada nodeapi para comenzar

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

Luego tengo esta función, la que intento obtener para guardar 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>"); }

Sin embargo, 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. "productos / helecho verde" y "productos / helecho verde"

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!


Es difícil decir cuán 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 path_redirect adicional, se ubica muy bien con el módulo path_redirect , que establecerá 303 redireccionamientos (o cualquier redirección que desee) en alias duplicados. Esto mitigará un poco sus preocupaciones SEO.

Editar:

¿Está súper seguro de que su código sin redactar llama a las funciones correctamente? Las secciones relevantes 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 puede intentar colocar algunos dpm() s justo antes de db_query en node.module para averiguar qué secciones del código están realmente sonando y qué datos están entrando en ellas.


JR, mejorando tu código en Drupal7, los db_querys son caros. Una mejor manera podría ser usar la función lookup_path drupal:

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

si urlAlias ​​no tiene ningún valor, no hay un alias para esta url, por lo que podemos crearlo de forma segura:

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


Pathauto está detectando alias duplicados para el nodo y sobrescribiendo 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 de acción Actualizar a "Crear un alias nuevo. Deje el funcionamiento del alias existente" en la pantalla de administración, /admin/config/search/path/settings , no sobrescribirá el alias personalizado.