it-swarm.dev

Zobrazit a WP 3.0 Vlastní menu ve formátu HTML Vyberte s automatickou navigací?

Jako součást motivu pro klienta chci mít možnost zobrazit vlastní nabídku (definovanou prostřednictvím administrátora) ve výběrovém poli, které automaticky změní stránky po změně výběru .

Existuje plugin (nebo praktický fragment kódu), který to splní?

3
Keith S.

Nový systém nabídek WordPressu je úžasný a nekonečně frustrující, v závislosti na tom, co se snažíte dělat a jaký den v týdnu se to stane. :) Je to skvělý nápad, ale zdaleka nezralý, zatímco je to funkce, kterou tleskám, budu šťastnější, když se v3.3 nebo v3.4 WordPressu vrátí a dostaneme mnohem více případů použití přímo podporovaných API systému nabídek. .

To znamená, že si nejste jisti, zda existuje existující plugin k tomu, co hledáte, ale jak o kódu musíte napsat vlastní plugin?Nebo byste ho mohli zahrnout do soubor functions.php vašeho motivu; bez ohledu na vaše preference.

To, co poskytuji, je plně samostatný příklad, který můžete uložit jako test.php do kořenového adresáře vašeho webu, abyste jej mohli otestovat. Pokud byla vaše doména example.com načtena pro testování na adrese:

http://example.com/test.php

Jak to vypadá v akci:

Inactive drop down of Pages from WordPress 3.0 Menu
(zdroj: mikeschinkel.com )
Active drop down of Pages from WordPress 3.0 Menu
(zdroj: mikeschinkel.com )

Z níže uvedeného kódu by mělo být snadné začlenit funkci get_page_selector() do motivu a zavolat ji vždy, když tuto funkci potřebujete:

<?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);
}

Takže by vás mohlo zajímat, jak to funguje?

Funkce wp_get_nav_menu_items()

WordPress 3.0 ukládá nabídky v tabulce wp_posts jako post_type typ nav_menu_item. wp_get_nav_menu_items() nepřímo volá pouze funkci get_posts(). Prvním parametrem wp_get_nav_menu_items() je buď 1.) název menu (což je to, co jsem použil: "My Select Menu" , 2.) ID položky menu (tj. Příspěvek položky menu ID databáze) nebo 3.) menu slim (slimák z názvu taxonomie menu; nabídky ano jsou implementovány pomocí taxonomických pojmů s taxonomií 'nav_menu'.)

Menu Configuration in WordPress 3.0
(zdroj: mikeschinkel.com )

Kromě prvního parametru předá get_posts() nejvíce (ne-li všechny?) $args předáte wp_get_nav_menu_items(), takže s ním můžete zacházet jako s vlastním typem příspěvku (i když je to delší období, když vylepšují rozhraní API, které pravděpodobně nebude Takový skvělý nápad, ale dnes?

Položky nabídky Filtrování pomocí meta_key a meta_value

WordPress 'základní použití příspěvků pro položky menu je důvod, proč můžeme dotaz na meta_key a meta_value; WordPress používá sérii meta_keys s předponou _menu_item pro další informace, které potřebuje pro každou položku nabídky. _menu_item_object bude obsahovat page pro každou položku nabídky, která odpovídá typu příspěvku WordPress stránky . (Pokud chcete zahrnout položky kromě stránek, které budete potřebovat udělat trochu více výzkumu, než jsem tu, ale alespoň jsem vám dal nástroje, které potřebujete udělat výzkum sami.)

Zde je screenshot pomocí Navicat pro MySQL dotazu zobrazujícího meta záznamy pro několik nav_menu_items:

Menu Item Configuration found in wp_postmeta with WordPress 3.0
(zdroj: mikeschinkel.com )

Uchopení adresy URL stránky pomocí get_post_link()

Dále upozorním na to, že se adresa URL dostane z funkce get_post_link() a že nastavuji <option> 's value na adresu HTML ...

<?php
    $link = get_page_link($page_menu_item->object_id);
    $selector[] =<<<HTML
<option value="{$link}">{$page_menu_item->title}</option>
HTML;

Pomocí onchange jazyka Javascript přejděte na vybranou stránku

... Abych ho mohl chytit z vlastnosti value vlastnosti 'page-selector'<select> a přiřadit jej location.href. Přiřazení location.href způsobí, že prohlížeč okamžitě přejde na novou adresu URL.

<?php
  $selector[] =<<<HTML
<select id="page-selector" name="page-selector"
    onchange="location.href = document.getElementById('page-selector').value;">
HTML;

Prázdná value="" jako výchozí možnost

Můžete si všimnout, že výchozí volba "Vybrat stránku" má prázdnou hodnotu; to není chyba, ale design. Když je vybráno a "onchange" je spuštěno1 nastavení location.href na prázdný řetězec nebude mít žádný vliv, což je přesně to, co chceme a nevyžaduje, abychom psali kód výjimky. Viola!

<?php
    $selector[] = '<option value="">Select a Page</option>';
  1. Po výběru spouštěče „Vybrat stránku“ "onchange" se může stát pouze v navigaci zpět na stránku, která nespouští znovu načtení stránky, kde byla dříve vybrána jiná možnost, ale může to být stále se to děje, takže bychom to měli řešit.
8
MikeSchinkel