ノードの作成時にプログラムでパスエイリアスを作成する


8

モジュールによって作成されたカスタムコンテンツタイプがあります。ノードの作成時にカスタムコンテンツタイプのパスエイリアスを設定するために使用できるフックはありますか?

私のフィールドの1つは英数字コードであり、パスでそれを使用したいと思います。例: 'event / myc0d3'

この関数(path_set_alias)が6に存在することに気付きましたが、7に相当するものを見つけることができません。また、どこで呼び出すかわかりません。

回答:


10

フックを使用する代わりに、Pathautoモジュールを使用する必要があります。ここでは、コンテンツタイプごとに(atで/admin/config/search/path/patterns)エイリアスを生成する特定のパターンを定義できます。そこでは、置換パターンを使用したり、独自のコードを作成したりできます。はるかにクリーンなアプローチです。

そうでない場合はhook_node_presave($node)、エイリアスを直接変更してみてください。

$node->path['pathauto'] = 0; // Required only if Pathauto is enabled.
$node->path['alias'] = "foo/bar";

またはpath_save(&$path)、以下のように関数を直接使用します。

$path = array('source' => "node/$node->nid", 'alias' => 'foo/bar');
path_save($path);

私にとっては両方の組み合わせのみが機能し、最終的にエイリアステキストフィールド内に正しいエイリアスが書き込まれました。path_save()のみを実行しても機能しましたが、ノード編集のエイリアステキストフィールドに間違ったエイリアスが含まれていたため、単純な再保存で間違ったエイリアスが再び表示されました。
leymannx


9

私の場合、hook_node_insert()は機能していませんでした。いくつかの検索で、このブログ投稿を思いつきました。同じ方法でprestoでhook_insert()を実装しました

/**
 * Implements hook_insert().
 */
function mymodule_insert($node) {
    // Set the URL alias
    if (empty($node->path['alias'])) {
        $node->path['alias'] = 'slug/' . $node->nid;
    }
}

2
これをhook_insert()実装するモジュールがコンテンツタイプを定義している場合にのみ使用されることに注意してください。フックを使用して、別のモジュールから定義されたコンテンツタイプのノードに作用することはできません。
kiamlaluno

これが、記事にリンクするだけではなく、回答を拡張してそれらの記事から主要な有用な情報を抽出することが推奨されない理由です。その「ブログ投稿」リンクは無効になり、404
Titiになります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.