テーマのtemplate.php
ファイルでユーザーが作成したノードの特別なパスエイリアスを設定する必要があります。 pathauto モジュールが有効になっています。私はすでに次のリンクで与えられている解決策を試しました
しかし、どれもうまくいきませんでした。これが私が試したいくつかのコードですが、失敗しました。
function THEME_nodeapi(&$node, $op, $a3=NULL, $a4=NULL){
if($node->type == "image"){
switch ($op){
case "insert":
$default_node_path = 'node/'.$node->nid;
$alternate_url = "SOME SPECIAL PATH";
path_set_alias($default_node_path, $alternate_url, 0, '');
break;
}
}
}
またはこれ
function THEME_insert($node){
$path = "SOME SPECIAL PATH";
$node->path = array('alias' => $path, 'pathauto' => FALSE);
}
function THEME_node_insert($node){
$path = "SOME SPECIAL PATH";
$node->path = array('alias' => $path, 'pathauto' => FALSE);
}
または
function THEME_nodeapi(&$node, $op, $a3=NULL, $a4=NULL){
if($node->type == "image"){
switch ($op){
case "insert":
$node->path = t("SOME SPECIAL PATH");
break;
}
}
}
プログラムでパスエイリアスを設定するにはどうすればよいですか?
[〜#〜]更新[〜#〜]
@ Ajit S で推奨されているこのコードを試しましたが、再び機能しませんでした
<?php
function THEME_node_insert($node){
$alias = "arar/".$node->nid;
$lang_code = "en";
$path = array(
'source' => "node/{$node->nid}",
'alias' => $alias, // Any alias that you want to set.
'language' => $lang_code, // Optional, if you are working on a multilingual site.
);
path_save($path);
}
hook_insert を使用します
/**
* Implements hook_insert().
*/
function mymodule_insert($node) {
// Set the URL alias
if (empty($node->path['alias'])) {
$node->path['alias'] = 'slug/' . $node->nid;
}
}
uRLにエイリアスがない場合は、作成できます
if( urlAlias == '' )
path_set_alias($default_node_path, $alternate_url, 0, '');
Hook_nodeapi実装はどれも機能しません。そのフックはDrupal 7.で削除されました。
テーマにフックを実装しようとしているため、他の試行は失敗しています。テーマはテーマフック、hook_theme、および変更フックのみを実装できます。
コードをモジュールに移動すると、幸運が増します。
パスエイリアスは、コアのパスモジュールを使用して設定できます。選択した関数(またはフック)から path_save
を呼び出すだけです。あなたの場合、hook_node_insert
に次のコードを実装することをお勧めします。これは、ノードが保存された後に呼び出され、ノードに有効なnidがあるためです。
// Assuming you have a $node object already.
$path = array(
'source' => "node/{$node->nid}",
'alias' => $alias, // Any alias that you want to set.
'language' => $lang_code, // Optional, if you are working on a multilingual site.
);
path_save($path);
グローバルリダイレクトが設定されている場合、ノードページはエイリアスにリダイレクトされます。
私はこれが古い投稿であることを知っていますが、Drupal 7サイトでこれを行うための素晴らしい方法を発見しました:
hook_node_presave
では、$node->path['pathauto']
がまだ設定されていない場合(つまり、これがノードの挿入でノードの更新でない場合)は、$node->original
を0に設定します。これにより、通常の場合は自動エイリアスが適用されなくなります。hook_node_insert', create the new path using
path_saveand make sure the source is
node/nid`内。以下は、mymodule
というカスタムモジュールの例で、 'my_fieldvalue not equal to
1, and that you want to customize the alias as
mycustomalias/my_field/nid`を持つすべての新しいmytype
ノードにこれが必要であると想定しています。
function mymodule_node_presave($node) {
// Add any conditions that determine whether this node needs a custom alias.
if (
$node->type == 'mytype' &&
!isset($node->original) &&
isset($node->field_my_field['und'][0]['value']) &&
$node->field_my_field['und'][0]['value'] != 1
) {
$node->path['pathauto'] == 0;
}
}
function mymodule_node_insert($node) {
// Add the same conditions as you had in mymodule_node_presave, except you don't need to check for $node->original.
if (
$node->type == 'mytype' &&
isset($node->field_my_field['und'][0]['value']) &&
$node->field_my_field['und'][0]['value'] != 1
) {
// Create a $new_path array that contains the source of your node and the custom alias you want.
$new_path = [
'source' => 'node/' . $node->nid,
'alias' => 'mycustomalias/' . $node->field_my_field['und'][0]['value'] . '/' . $node->nid],
];
// Save the path. By using the variable above rather than putting the array into the function call, you avoid PHP errors.
path_save($new_path);
}
}