ユーザーが特定のナビゲーションメニュー項目間の区切り記号や区切り記号をドロップできるようにする方法について誰かが考えを持っていますか?
グーグルは最初/最後の子セレクターのためのルーキーなCSSのヒントを提起するように思われるだけですが、私はFirefoxのブックマークに非常によく似た何かの後にいます。
更新:
I doこれまでのすべての入力に感謝しますが、それ以上の混乱を避けるために詳しく説明します。
wp_nav_menu
を使った出力では、何らかの形や形式のものです。通常私は掘り下げて仕事に就くだけです。しかし、これは単なる可能な今後のプロジェクトの要件)なので、私は誰かがすでに似たようなことを試したかどうか私は見るだろうと思いました。
さらに、私はそれが実際に他の人に役立つかもしれないと思いました、そして、私がそれを続けるならば私自身のフィードバック/結果を掲示するであろう。
カスタムウォーカーを使用します 。メニュータイトルが単に<li class="menu_separator"><hr></li>
である場合は、start_el()
を拡張して'-'
を表示します。
function wpse38241_setup_menu()
{
register_nav_menu( 'main-menu', 'Main Menu' );
}
add_action( 'after_setup_theme', 'wpse38241_setup_menu' );
/**
* Replaces items with '-' as title with li class="menu_separator"
*
* @author Thomas Scholz (toscho)
*/
class Wpse38241_Separator_Walker extends Walker_Nav_Menu
{
/**
* Start the element output.
*
* @param string $output Passed by reference. Used to append additional content.
* @param object $item Menu item data object.
* @param int $depth Depth of menu item. May be used for padding.
* @param array $args Additional strings.
* @return void
*/
public function start_el( &$output, $item, $depth, $args )
{
if ( '-' === $item->title )
{
// you may remove the <hr> here and use plain CSS.
$output .= '<li class="menu_separator"><hr>';
}
else
{
parent::start_el( &$output, $item, $depth, $args );
}
}
}
それではいつものメニューを作りましょう。タイトルとして'-'
を使用して項目を追加します。
wp_nav_menu(
array (
'menu' => 'main-menu',
'container' => FALSE,
'container_id' => FALSE,
'menu_class' => '',
'menu_id' => FALSE,
'walker' => new Wpse38241_Separator_Walker
)
);
(読みやすくするために再フォーマット)
<ul id="menu-separated" class="">
<li id="menu-item-92" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-92">
<a href="https://wordpress.stackexchange.com/questions/38241/nav-menu-separators">Nav menu separators?</a>
</li>
<li class="menu_separator">
<hr>
</li>
<li id="menu-item-93" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-93">
<a href="https://wordpress.stackexchange.com/">wordpress.stackexchange.com</a>
</li>
</ul>
これはJavaScriptとCSSがなくても機能します。
これには、ユーザーの設定を保存して再入力時に再作成するPHPスクリプトと、それらを配置できるようにするJSスクリプトの2層が必要です。あなたがそれを配置する方法はあなた次第です、私はおそらくドラッグアンドドロップインターフェースを使います。私のスクリプトは次のようになります。
add_action( 'wp_enqueue_scripts', 'my_divider_enqueue' );
add_action( 'wp_ajax_insert-divider', 'ajax_insert_divider' );
// enqueue the script
function my_divider_enqueue() {
// register the script elsewhere, preferably in an init hook
wp_enqueue_script( 'divider-js' );
$passed_vars = array(
'ajaxurl' => admin_url('admin-ajax.php' ),
'nonce' => wp_create_nonce( 'divider-ajax-nonce' )
);
if( is_user_logged_in() )
$passed_vars['prev'] => get_user_meta( $current_user->ID, 'divider_location', true ); // you shouldn't need to declare $current_user, but you may
wp_localize_script( 'divider-js', 'divider', $passed_vars );
}
// handle the js
function ajax_insert_divider() {
if( !wp_verify_nonce( $_POST['divider_nonce'], 'divider-ajax-nonce' ) ) {
header("HTTP/1.0 401 Internal Server Error", true, 401);
exit;
} else {
//may not be necessary, you can test this
global $current_user;
get_currentuserinfo();
//update user meta
update_user_meta( $current_user->ID, 'divider_location', $_POST['divider_location'] );
}
exit;
}
ドキュメント: wp_register_script()
、 wp_enqueue_script()
、 wp_localize_script()
、 wp_create_nonce()
、 is_user_logged_in()
、 get_user_meta()
、 wp_verify_nonce()
、 get_currentuserinfo()
update_user_meta()
そしてその後、ユーザーが変更したときに処理するjavascript/jQueryがあります(実装は決定する必要があるので、これは擬似コードです)。
jQuery(document).ready(function(){
//when the user releases the divider in the desired location, do some stuff
jQuery('.divider').mouseup(function() {
if( divider_is_valid() ) {
place_divider();
} else {
reset_divider();
}
});
//using divider.prev, place the desired dividers
});
function reset_divider() {
//put the divider back where it started, either in a holder for unused dividers or where it was in the menu previously
}
function place_divider() {
//place divider where it's going
jQuery.post(
divider.ajaxurl,
{
action : 'insert-divider',
divider_nonce : divider.nonce,
location : //some representation of the location that you can call later
},
function( response ) {
//execute any actions you need to do on response
}
);
}
スクリプトは完全にテストされていません(私はそれをアンサーエディタlolに直接書きました)が、正しい方向に進むはずです。