人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

WordPressの質問です。
ものすごい初歩的な話で申し訳ないのですが、
サーバを以降するにあったて、ページのidが変わってしまうので、スラッグなどでリンクを貼り直したいのですが、どんな書き方か忘れてしまったので教えていただきたいです。

<a href="?page_id=88">こんな書き方だったので、このままだと、リンクが変わってしまいます。

●質問者: snoopy_japan
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● oil999
●50ポイント

phoMyAdminを使ってMySQLのデータを全部移行すれば、IDは変わらずに済みますよ。
http://lab.komadoya.com/blog/2011/02/server-transfer-guide-wp.php


snoopy_japanさんのコメント
スラッグにリンクって貼れなかったですか?

2 ● pigmon88
●50ポイント

その書き方だとリンクは変わらないはずですが・・・いずれにせよ、一括で書き直したい場合は、sedというコマンドを使ったアプリでできます。

http://download.nifty.com/download/win/util/text/sed/


snoopy_japanさんのコメント
書き方変えたいわけではないんで、、

3 ● rouge_2008
●100ポイント ベストアンサー

WordPressループ中で使用する場合、「the_permalink()」あるいは「get_permalink()」が利用できます。
※パーマリンク設定がデフォルトの場合は「/page_id=**」のようなクエリ形式で、それ以外の場合はページのタイトル(※スラッグを設定している場合はスラッグが優先)でURLが出力されます。(※投稿の場合は、パーマリンク設定に合わせて年・月・日、記事ID等も出力されます。)


HTMLコード内では「the_permalink()」、PHPコード内では「get_permalink()」を利用するといいです。

<ul>
<li><a href="<?php the_permalink(); ?>">記事タイトル1</a></li>
...

<?php
echo '<ul>';
echo '<li><a href="' . get_permalink() . '">記事タイトル2</a></li>';
...
?>


※「the_permalink()」は出力まで実行してしまうので、PHPのecho等と合わせて利用するのは不向きです。先に出力されて目的の属性が空になる問題が発生します。(「get_permalink()」は取得するだけなので、echo等を利用しないと出力されません。)

・the_permalink()
http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_permalink
・get_permalink()
http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_permalink


【※追記※】

グローバルナビゲーションのメニューでしたら、通常は「wp_nav_menu()」を利用して表示しているようです。
URLはパーマリンク設定に合わせて出力されますので、リンクのコードを変更する必要はありません。(※PHPでダイナミックに出力しているので、設定を変更した場合も自動で適用されます。)

・管理画面の「外観」→「メニュー」で作成したメニューを指定して表示する場合

<header>
<?php wp_nav_menu( array('menu' => '表示したいメニュー名') ); ?>
</header>

※利用しているテーマによっては、functions.phpで「add_theme_support('menus')」を実行して、ナビゲーションメニューのサポートを有効にする必要があるかもしれません。

・表示するメニューを管理画面の「外観」→「メニュー」で選択する場合

<header>
wp_nav_menu( array( 'theme_location' => 'top_navi' )
</header>

※次のようにfunctions.phpでカスタムメニューを登録して置く必要があります。

register_nav_menu( 'top_navi', 'Top Navigation' );


カスタムメニューの利用方法は次のページを参考にしてください。
http://www.koikikukan.com/archives/2012/02/16-015555.php
http://www.koikikukan.com/archives/2012/02/17-015555.php

・テンプレートタグ/wp_nav_menu
http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_nav_menu
・関数リファレンス/add_theme_support
http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_theme_support


ループ内で「the_permalink()」あるいは「get_permalink()」を利用する場合、またはwp_nav_menu()等だけでなく、 wp_list_pages()やウィジェットを利用して表示する場合など、何れの方法でもパーマリンク設定が関係しています。
パーマリンク設定がデフォルトのままでは「p=**」のようなクエリ形式のURLになりますので、管理画面の「設定」→「パーマリンク設定」で任意のパーマリンクに変更してください。
※「数字ベース」など「%post_id%」を使用するパーマリンクだと、記事IDが使われますので、「投稿名」など「%postname%」を使用する設定にするといいです。
(「%postname%」を設定した部分は記事タイトルが使われます。スラッグを指定している場合は、記事タイトルに優先してスラッグが使われます。)
※「%postname%」を利用しないで投稿日時を利用する場合、「/%year%/%monthnum%/%day%/%hour%%minute%」のように最低限分単位まで指定しないと、同じ日に投稿があった場合に記事の判別ができなくなります。(※できれば秒まで指定するといいかもしれません。)

・パーマリンク設定
http://wpdocs.sourceforge.jp/%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2/%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%83%B3%E3%82%AF%E8%A8%AD%E5%AE%9A

ナビゲーションのメニュー以外にget_posts()等で自分でクエリを発行してループを作成する場合も、「the_permalink()」あるいは「get_permalink()」を利用してリンクURLを出力すると、パーマリンク設定に合わせて出力されるので便利です。

・テンプレートタグ/get_posts
http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_posts


rouge_2008さんのコメント
> 個別ページへのリンクの書き方 投稿の個別ページでしょうか? 固定ページと同じで「the_permalink()」あるいは「get_permalink()」が利用できます。 次のようなWordPressループ内で使用すると、カレント記事のURLをパーマリンク設定に合わせて出力します。 >|| <?php if ( have_posts() ) : /* 記事がある時 */ ?> <?php while ( have_posts() ) : the_post(); ?> /* ループ内処理※ここに処理を記述 */ <h1><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>" rel="bookmark"><?php the_title(); ?></a></h1> <?php endwhile; ?> <?php endif; ?> ||< ・ループ http://wpdocs.sourceforge.jp/The_Loop 対象ページをどのように決めている(※どのようなページに個別ページへのリンクを出力したい)のでしょう? トップページ「index.php」やカテゴリーページ「category.php」など、各テンプレートファイルで表示するページにアクセスした時に、WordPressは標準でそのページ用のクエリを生成します。 クエリを書き換えたい時は「query_posts()」を、そのページのループ(※メインループ)とは別のループを作成したい時は「get_posts()」を使うといいです。(※ループタグの開始前にこれらのテンプレートタグでクエリを発行します。) ・テンプレート階層 http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%9A%8E%E5%B1%A4 ※投稿の場合もパーマリンク設定がデフォルトのままでは「p=**」のようなクエリ形式のURLになります。 管理画面の「設定」→「パーマリンク設定」で任意のパーマリンクに変更してください。 ※「数字ベース」など「%post_id%」を使用するパーマリンクだと、記事IDが使われますので、「投稿名」など「%postname%」を使用する設定にするといいです。 (「%postname%」を設定した部分は記事タイトルが使われます。スラッグを指定している場合は、記事タイトルに優先してスラッグが使われます。) ・パーマリンク設定 http://wpdocs.sourceforge.jp/%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2/%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%83%B3%E3%82%AF%E8%A8%AD%E5%AE%9A ※テンプレートの記述方法については、デフォルトテーマの「Twenty Eleven」や「Twenty Ten」が参考になりますので、一度眺めてみてください。

rouge_2008さんのコメント
「%postname%」(※投稿名)などタグの記述方法も知りたいかもしれませんので補足します。 http://wpdocs.sourceforge.jp/wiki/index.php?title=%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9&oldid=4269 ※ページ変更によりなぜか削除されたようですので、ページの編集履歴の方です。 >> <span style="font-weight:bold;font-size:large;">構成タグ</span> 注: パーマリンクスロットには、サイト URL を決して入れないでください。構成タグあるいは構成タグの組み合わせのみを使用してください。 "Pretty" と "Almost Pretty" パーマリンクのカスタマイズには、次のタグが使えます。以下のヒントも参考にしてください。 -パーマリンクが%post_id%あるいは%postname% (例えば、/%year%/%monthnum%/%day%/%postname%/等) で終わるようにして、各パーマリンクが個別投稿を示すようにしてください。 -パフォーマンスの観点から、パーマリンク構造がカテゴリ名、タグ名、著者名、投稿タイトルフィールドから始まるのは好ましくないといえます。これらはテキストフィールドなので、パーマリンク構造の先頭に用いると、WordPress が投稿とページ (ページは常にページスラッグを URL に含みます) を区別するのに時間がかかり、代償として、WordPress が余計な情報をデータベースを蓄えることになります (多くのページがあるサイトは大変でしょう)。したがって、/%year%/%post_name%/ や、さらには /posts/%post_name/ のように、少なくとも 2 つのパスセグメントを含めるのがベストでしょう。(パフォーマンスの観点から /%post_id%/%post_name%/ を推奨する人もいますし、この形式はユーザーと URL のインタラクションの多くの文脈で親切でないと批判する人もいます。) このトピックについての詳細は [http://ottopress.com/2010/category-in-permalinks-considered-harmful/:title=Otto's technical writeup] あるいは wp-testers メーリングリストを参照してください。 <span style="font-weight:bold;">%year%</span> 投稿年・4桁 (例)2004 <span style="font-weight:bold;">%monthnum%</span> 投稿月 (例)05 <span style="font-weight:bold;">%day%</span> 投稿日 (例)28 <span style="font-weight:bold;">%hour%</span> 投稿時刻の「時」 (例)15 <span style="font-weight:bold;">%minute%</span> 分 (例)43 <span style="font-weight:bold;">%second%</span> 秒 (例)33 <span style="font-weight:bold;">%postname%</span> サニタイズされた投稿タイトル (投稿スラッグ)。タイトル「This Is A Great Post!」だったら URI は「this-is-a-great-post」になります。<span style="font-weight:bold;">パフォーマンス上の理由で %postname% で始まるパーマリンクは非推奨です。</span> <span style="font-weight:bold;">%post_id%</span> 投稿固有の ID 番号(例)423 <span style="font-weight:bold;">%category%</span> サニタイズされたカテゴリー名 (カテゴリースラッグ)。入れ子であるサブカテゴリは、URI でも入れ子のディレクトリとして表されます。<span style="font-weight:bold;">パフォーマンス上の理由で %category% で始まるパーマリンクは非推奨です。</span> <span style="font-weight:bold;">%tag%</span> サニタイズされたタグ名 (タグスラッグ)。<span style="font-weight:bold;">パフォーマンス上の理由で %tag% で始まるパーマリンクは非推奨です。</span> <span style="font-weight:bold;">%author%</span> サニタイズされた著者名 <span style="font-weight:bold;">パフォーマンス上の理由で %author% で始まるパーマリンクは非推奨です。</span> <<

snoopy_japanさんのコメント
パーマリンクで登録してみよと思います。

rouge_2008さんのコメント
wp_nav_menu()を利用したメニュー表示になっていた(※パーマリンク変更だけで解決する記述になっていた)という事でしょうか? スラッグを利用するには、パーマリンクの設定を「デフォルト」以外にする必要があります。 タイトル欄の下のパーマリンクの所に表示されている「パーマリンクの変更」ボタンが「編集」に変わりますので、そちらからスラッグを設定できます。(※右上の「表示オプション」で「スラッグ」にチェックを入れると、スラッグの入力欄が表示されますので、そちらから指定する事も可能です。) ※投稿の場合も「%postname%」を指定していれば、この部分だけスラッグに変更できます。 参考までに直接ページを指定してリンクURLを出力する場合の記述です。 ただ、これだとURLだけでなくページのデータをすべて取得していますし、カスタムメニューの方が便利ですので、そちらを利用するようにした方がいいと思います。 >|| <?php $page = get_page_by_title( 'Sample Page' ); ?> <?php echo '<a href="/' . esc_url($page->post_name) .'/">' . esc_html($page->post_title) . '</a>'; ?> ||< 現在の状態で何か不明な箇所があるのでしたら、どの部分が不明なのか(何を知りたいのか)具体的に教えてください。 この質問での疑問点が解決したのでしたらいいのですが、何が分からないのか分からないと答えようがありませんので・・・ ちょっと確認してみましたが、投稿・固定ページ・メディア、メニューなどwp_postsに保存されるデータで、重複するIDのデータがない場合は、元のIDでインポートされるようです。 既に同じIDの何れかのデータが存在する場合は、IDが新しく割り振られてしまいます。 新規にインストールした直後の状態にインポートする場合はID変更の問題は起きないかもしれませんが、少し確認しただけで確実ではありません。 参考情報としてだけ一応お知らせします。

質問者から

個別ページへのリンクの書き方がききたいのですけど、、


4 ● fut573
●100ポイント

うーん。要するに質問者さんは移転後もリンクが死なないための手段としてスラッグへのリンクを検討していて、回答者さんたちは他の方法があるよと回答している状態でしょうか?
既にみなさんが指摘しているように、wordpressでサーバー移転をする時にはページidを変えないで移転する方法があります。
個別記事へのリンクの方法は a href="?p=88" というようにwordpressのデフォルトurlでリンクしてあげると、自動転送されます。これはパーマリンクの形式が変わっても有効です。
(現在のサーバーで、この書き方を試してみて、転送されるかどうか確認してみてください。多分大抵の環境ではちゃんと飛びます)
つまり、ページidを変更しない方法で移転をして、個別記事へのリンクはデフォルトurlの形式で張る方法なら、とりあえずリンクが外れること無く移転できるのではないかと思われます。
また、もし正規表現の知識があるのでしたら、wordpressの「redirection」というプラグインを使えば、現在のリンクを修正すること無く、プラグインの設定を一行書き換えるだけで、リンクを新URLに自動的に転送することが可能です。


rouge_2008さんのコメント
私の回答はスラッグへのリンク方法ですが・・・ (※fut573さんでしたらご存知だと思いますが、パーマリンク設定によって記事URLが変わるのはWordPressの仕様で、「the_permalink()」および「get_permalink()」はパーマリンクに合わせたURLを取得(※と表示)します。) サーバー移行によるページIDの変更を心配しているようなので、WordPressのエクスポートデータではなく、MySQLのデータベースをエクスポートすればIDは変更にならない事を回答しているのがNo.1のoil999さんで、それに対してスラッグへのリンクができなかったか質問者さんが返信しているので、あくまでもスラッグへのリンク方法が知りたいのかと思って回答しました。 No.2のpigmon88さんは質問を誤解して回答したのだと思います。 確かにリンクの記述(※HTMLコード)自体は変わらないと思いますが、ID変更により記事のURLが変更になるのが問題なので・・・ 移転後少しの間なら問題ないと思いますが、継続してリダイレクトが発生する状態にしておくのはあまり良くないような気がしますので、リンクはきちんと変更した方がいいと思います。 あくまでも移転などURL変更時に、外部サイトからのリンクが切れないようにする対策だと思いますので・・・ できればスラッグなどIDが関係しないパーマリンクに変更してリンクの記述を変更するか、IDを変更しない方法(※データベースのエクスポートおよびインポート)で移行して現在のパーマリンク設定のまま運用した方がいいと思います。

fut573さんのコメント
うーん。rouge_2008さんのやり方はテンプレートの変更方法についての言及ですよね。もしかして質問者さんが聞いているのは個別記事内の「文中リンク」の変更方法なんじゃないかと僕は読んだんですが。 つまり「(個別記事から)個別記事へのリンクの書き方を聞きたいんですけど」と言いたかったんじゃないかなぁと。 で、その場合、テンプレートタグのthe_permalinkで実装するとちょっとめんどくさい処理が必要な気がします。

rouge_2008さんのコメント
『どんな書き方か忘れてしまった』とありますので、やはりテンプレートでの記述を聞いている質問ではないかと思います。 投稿(あるいは固定ページ)内では、単にリンクボタンを利用して既存ページへのリンクを貼るだけですし、忘れるという事はないと思いますから・・・ それに、投稿などの本文は単なるテキストデータですから、テンプレートタグなどのような特別な書き方というのもないはずです。 何らかのプラグインを入れて実装している場合、その事を質問あるいは思った回答を得られなかった時点で書くと思いますし、私の回答に対しても「テンプレートの事ではなく記事本文内のリンクの事です。」等の補足があっても良かったと思うのですが、その後返信がないので解決したのかと思っていましたが・・・ 本文内のリンクでしたら、数も少ないと思いますので、手動で貼り直した方が早いと思いますが・・・ とにかく質問者さんからの返信がないと、実際に何を知りたかったのかは分かりません。

snoopy_japanさんのコメント
記事内のリンクではなく、グローバルナビです。 サイトを移行するにあったて、pageidではなく、その個別ページのスラッグを指定してそこにリンクを貼りたかっただけです。 なぜかというと、サーバ移行するにあったて環境をそのまま移すと、いろいろゴミが多いのである程度手作業で移動しようとおもっていました。 スラッグなら変化せずにリンク切れが起こらないと思って質問した次第です。 なをグローバルナビなのでループの外です、 page_idの部分をSlugなどに変えて <a href=php slug="about" > のような指定は出来なかったですかという質問です。 忘れたというのはどこかで、このような書き方を見た気がしていたので、記憶違いでしたら申し訳ないことをしました。

rouge_2008さんのコメント
そのような記述方法は見たことがありませんが、現在はどのようにナビゲーションのメニューを表示しているのでしょう? 通常利用されている方法を回答に追記しましたので、参考にしてください。

fut573さんのコメント
ああ、なるほどナビですか。 それでスラッグ指定となるともしかして、個別ページへのリンクではなく<b>固定ページ</b>へのリンク方法とごっちゃになっていたりしませんか?

snoopy_japanさんのコメント
そうです、ごめんさない。固定ページへのリンクです。

fut573さんのコメント
それでしたら、ダッシュボード→固定ページ→新規追加 から使いたい名前の固定ページを作成してみたら、 自然にスラッグがURLになるんじゃないかなと思います。

snoopy_japanさんのコメント
ありがとございます、なんとかなりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ