クライアントのテーマの一部として、カスタムメニューを表示できるようにしたい(管理者によって定義された)選択を変更した後にページを自動的に変更する選択ボックス内。
これを達成するプラグイン(または便利なコードスニペット)はありますか?
WordPressの新しいメニューシステムは、何をしようとしているのか、そして何曜日になるのかにもよりますが、不思議でありながら無限にイライラするものです。 :)これは素晴らしいアイデアですが、成熟しているとは言い難いので、WordPressのv3.3またはv3.4がリリースされ、メニューシステムのAPIによって直接サポートされるもっと多くのユースケースが得られると嬉しくなるでしょう。 。
そうは言っても、あなたが探しているものを実行するための既存のプラグインがあるかどうかわからないが、あなたがあなた自身のプラグインを書くために必要なコードはどうですか?テーマのfunctions.php
ファイルにあります。あなたの好みは何でも。
私が提供しているものはテストするためにあなたがあなたのウェブサイトのルートディレクトリにtest.php
として保存できる完全に自己完結型の例です。あなたのドメインがexample.com
だった場合は、次の場所にテストをロードします
http://example.com/test.php
これが動作中の様子です。
(出典: mikeschinkel.com )
(出典: mikeschinkel.com )
以下のコードから、get_page_selector()
関数をあなたのテーマに組み込み、この機能が必要なときはいつでもそれを呼び出すのは簡単なはずです。
<?php
include "wp-load.php";
echo 'Jump to:';
echo get_page_selector('My Select Menu');
function get_page_selector($menu) {
$page_menu_items = wp_get_nav_menu_items($menu,array(
'meta_key'=>'_menu_item_object',
'meta_value'=>'page',
));
$selector = array();
if (is_array($page_menu_items) && count($page_menu_items)>0) {
$selector[] =<<<HTML
<select id="page-selector" name="page-selector"
onchange="location.href = document.getElementById('page-selector').value;">
HTML;
$selector[] = '<option value="">Select a Page</option>';
foreach($page_menu_items as $page_menu_item) {
$link = get_page_link($page_menu_item->object_id);
$selector[] =<<<HTML
<option value="{$link}">{$page_menu_item->title}</option>
HTML;
}
$selector[] = '</select>';
}
return implode("\n",$selector);
}
それで、あなたはそれがどのように機能するか疑問に思うかもしれません?
wp_get_nav_menu_items()
関数WordPress 3.0は、メニューをwp_posts
テーブルのpost_type
タイプとしてnav_menu_item
として保存します。 wp_get_nav_menu_items()
は間接的にget_posts()
関数を呼び出すだけです。 wp_get_nav_menu_items()
の最初のパラメータは、1)メニュー名(これは私が使ったものです。 "My Select Menu")、2.)メニューアイテムID(つまり、メニューアイテムの投稿)です。 ID
データベース、または3.)メニュースラッグ(メニューの分類用語からのスラグ。はいメニューは、'nav_menu'
の分類法を持つ分類用語を使用して実装されています。)
(出典: mikeschinkel.com )
最初のパラメータを超えて、get_posts()
に渡す$args
のほとんど(全部ではないにしても)のwp_get_nav_menu_items()
に転送するので、カスタム投稿タイプのように扱うことができます。でも、今日は太陽が輝いている間に干し草を作ろう!)
meta_key
とmeta_value
を使ったメニュー項目のフィルタリングWordPressの基本的なメニュー項目への投稿の使用は、meta_key
とmeta_value
を問い合わせることができる理由です。 WordPressは、各メニュー項目に必要な追加情報として、接頭辞meta_keys
が付いた一連の_menu_item
を使用します。 _menu_item_object
には、WordPressの "Page"投稿タイプに対応するすべてのメニュー項目のpage
が含まれます。 (Pages以外のアイテムを含めたい場合は、ここで行ったよりももう少し調査を行う必要がありますが、少なくとも自分で調査を行うために必要なツールを提供しました。)
これは、 Navicat for MySQL を使用して、いくつかのnav_menu_items
のメタレコードを表示するクエリのスクリーンショットです。
(出典: mikeschinkel.com )
get_post_link()
でページのURLをつかむ次に、get_post_link()
関数からページのURLを取得し、HTMLの<option>
のvalue
をURLに設定していることを指摘します。
<?php
$link = get_page_link($page_menu_item->object_id);
$selector[] =<<<HTML
<option value="{$link}">{$page_menu_item->title}</option>
HTML;
onchange
を使用して選択したページに移動する... 'page-selector'
<select>
要素のvalue
プロパティから取得し、それをlocation.href
に割り当てることができます。 location.href
を割り当てると、ブラウザはすぐに新しいURLに移動します。つまり、簡単に言うと、すべて完了です。
<?php
$selector[] =<<<HTML
<select id="page-selector" name="page-selector"
onchange="location.href = document.getElementById('page-selector').value;">
HTML;
value=""
あなたは "ページを選択"デフォルトオプションが空の値を持っていることに気づくかもしれません。それは間違いではなく、設計によるものです。それが選択されていて"onchange"
がトリガーされたとき1 location.href
を空の文字列に設定しても効果はありません。これはまさに私たちが望むものであり、例外コードを書く必要はありません。 Viola!
<?php
$selector[] = '<option value="">Select a Page</option>';
"onchange"
を選択することは、以前に別のオプションが選択されていたページの再読み込みをトリガーしないページへのブラウザバックナビゲーションでのみ発生する可能性があります。まだ起きているのでそれに取り組むべきです。