web-dev-qa-db-ja.com

ノードの保存時にプログラムでノードエイリアスを設定する方法

テーマのtemplate.phpファイルでユーザーが作成したノードの特別なパスエイリアスを設定する必要があります。 pathauto モジュールが有効になっています。私はすでに次のリンクで与えられている解決策を試しました

  1. ノードの作成時にプログラムでパスエイリアスを作成
  2. 設定方法Nodeプログラムでパス/エイリアス
  3. プログラムでパスエイリアスを設定

しかし、どれもうまくいきませんでした。これが私が試したいくつかのコードですが、失敗しました。

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);
    }
1
M a m a D

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, '');
2
Adi

Hook_nodeapi実装はどれも機能しません。そのフックはDrupal 7.で削除されました。

テーマにフックを実装しようとしているため、他の試行は失敗しています。テーマはテーマフック、hook_theme、および変更フックのみを実装できます。

コードをモジュールに移動すると、幸運が増します。

6
Clive

パスエイリアスは、コアのパスモジュールを使用して設定できます。選択した関数(またはフック)から 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);

グローバルリダイレクトが設定されている場合、ノードページはエイリアスにリダイレクトされます。

5
AjitS

私はこれが古い投稿であることを知っていますが、Drupal 7サイトでこれを行うための素晴らしい方法を発見しました:

  1. hook_node_presaveでは、$node->path['pathauto']がまだ設定されていない場合(つまり、これがノードの挿入でノードの更新でない場合)は、$node->originalを0に設定します。これにより、通常の場合は自動エイリアスが適用されなくなります。
  2. hook_node_insert', create the new path usingpath_saveand make sure the source isnode/nid`内。

以下は、mymoduleというカスタムモジュールの例で、 'my_fieldvalue not equal to1, and that you want to customize the alias asmycustomalias/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);
  }
}
1
Tom Bisciglia