Antworten auf deine Fragen:
Neues Thema erstellen

Wordpress - Widgets - fortlaufende ID vergeben

CanTk

Nicht mehr ganz neu hier

Hey,
Ich setze gerade ein neues Template für Wordpress um.
Aktuell komme ich hier nicht weiter:

Ich will, dass die Sidebar über Widgets abläuft, jedem Widget voran, soll sein Titel in einer h5 Überschrift stehen - alles kein problem, lässt sich ja sauber mit Wordpress lösen

<?php
if ( function_exists('register_sidebar') )
register_sidebar(array(
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h5>',
'after_title' => '</h5>',
));
?>

Nun will ich jedoch, das jedes Widget eine besondere Farbgebung erhält - egal wie der Benutzer sie anordnet. Sprich das oberste Element ist immer blau dann folgt ein grünes. Um dies zu erreichen habe ich mir gedacht, ist es am einfachsten, wenn ich jedem before_widget div eine durchnummerierte ID gebe und dann über die im CSS definiere

#nav1 h5 {
color:#...;
background:#...;}

Jetzt steh ich aber vor dem Problem, dass ich ja innerhalb des Arrays nicht PHP schreiben kann.
Sonst würde ich eine Funktion definieren die zählt und dann immer nav1, nav2 etc ausgibt.
Wie handle ich das jetzt am besten?

Doch irgendwie per javascript die IDs vergeben lassen? (geht das?)

// 2. Thema
Eine "ist es möglich" frage. :D


Kann ich mit Javascript alle DIV Elemente einer Klasse mit durchgehend aufsteigenden ID's benennen?
Wenn ja wie nennt sich das bzw. wonach soll ich googlen ?

Bin grade leider etwas Ahnungslos.

Gruß Can
 
Zuletzt bearbeitet von einem Moderator:

Doitsu

Aktives Mitglied

AW: Javascript IDs vergeben

Googeln? Hm.. Nach getElementsByClassName.. Dies ist allerdings keine offizielle Javascript Funktion, wird zwar (glaube ich) im Firefox unterstuetzt, aber sonst nirgends.
Anschliessend brauchst du nur noch eine for-Schleife die die Elemente durchgeht und die IDs setzt ..
 

CanTk

Nicht mehr ganz neu hier

AW: Wordpress - Widgets - fortlaufende ID vergeben

Wenn das nicht in allen Browsern läuft muss ich wohl auf eine Lösung im PHP Code hoffen. Doch ich bin langsam mit meinem Latein am ende auch mit ner Global Variable komme ich nicht weiter.
Ob es nun sinnvoll ist diese 2 Threads zusammenzuhauen. kA.
 

Doitsu

Aktives Mitglied

AW: Wordpress - Widgets - fortlaufende ID vergeben

Sicher, du hast in dem 1. ja den 2. schon irgendwie angedeutet..

Und es gibt loesungen diese Funktion fuer alle Browser zugaenglich zu machen.
Wenn du googelst (was du machen wolltest, deswegen steht oben kein Link) findest du haufenweise ergebnisse und loesungen dafuer.. Ich habe das mit Firefox nur angedeutet (Wenn du jQuery drin hast, kannst du das auch damit loesen).

getElementsByClassName
Aber: Bevor du diese Funktion einbaust, sollte per if-Abfrage geprueft werden, ob es diese schon gibt (if(!document.getElementsByClassName){)

ansonsten kann ich dir leider nicht helfen, hatte noch nie mit Wordpress zu tun.. :/
Wobei eine loesung mit PHP eh besser waere, weil sonst wohl nix mehr angezeigt wird, wenn der User Javascript deaktiviert.
 
Zuletzt bearbeitet:

cebito

undefined

AW: Wordpress - Widgets - fortlaufende ID vergeben

Zu deiner ursprünglichen Frage :hmpf::

PHP:
<!doctype html>
<html>

<head>
    <title>Titel</title>

    <meta charset="UTF-8" />
    <meta name="description" content="" />
    <meta name="author" content="" />
    <meta name="keywords" content="" />

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

</head>

<body>
<div class="test"></div>
<div class="test"></div>
<div class="test"></div>
<div class="test"></div>
<script>
for($i=0;$i<$('.test').length;$i++){
    $('.test:eq('+$i+')').attr('title',$i);
}
</script>
</body>
</html>
 

Doitsu

Aktives Mitglied

AW: Wordpress - Widgets - fortlaufende ID vergeben

@cebito: Nur wegen einer Funktion gleich jQuery einbinden? Halte ich fuer ueberzogen.

@TE:
Hatte gerade Langeweile und mal geschaut, es gibt die moeglichkeit, das zu aendern.. Aber: Du greifst in den Core ein. Ob das gute Auswirkungen hat.. Wohl kaum. Und ob mach so was machen darf - weiss ich auch nicht.

Wie auch immer: Du musst in die /wp-includes/widgets.php

Dort steht auf Zeile 864

PHP:
	foreach ( (array) $sidebars_widgets[$index] as $id ) {
Daraus machst du:
PHP:
	foreach ( (array) $sidebars_widgets[$index] as $nr => $id ) {
hier sagst du also nur, dass du den aktuellen Key des Arrays haben willst - der quasi die Nummer darstellt. (als $nr gespeichert)

Dann geht es in die Zeile 882, wo steht:
PHP:
		$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);

Daraus wird
PHP:
		$params[0]['before_widget'] = sprintf($params[0]['before_widget'], 'my_id' . $nr, $classname_);
gemacht .. Wo du also nur sagt, dass er nicht den Widgetnamen als ID nutzen soll, sondern 'my_id' und die Nummer die wir vorhin ausgelesen haben ..

Aber wie gesagt: Das kann boese folgen haben, da ALLE Widgets dann so eingestellt werden (es kann also auch zu unregelmaessigkeiten in den Nummern kommen). Also: von der Datei vorher ein Backup ziehen!

Edit:
Man kann das 'in den Core' eingreiffen auch verhindern, ebenso die unregelmaessigkeiten der Nummern, indem man die Funktion kopiert und innerhalb der Foreachschleife dann einfach eine Variable immer um eins erhoeht.
 
Zuletzt bearbeitet:

cebito

undefined

AW: Wordpress - Widgets - fortlaufende ID vergeben

@cebito: Nur wegen einer Funktion gleich jQuery einbinden? Halte ich fuer ueberzogen.
Die meisten WP-Plugins nutzen jQuery, kaum einer (vor allem Laien nicht) kommt ohne Plugins aus. In dem Sinne, warum nicht etwas nutzen, was eh schon da ist ;)

An den Core-Dateien rumzufummeln halt ich nix von, das wird ein Rattenschwanz - bei jeder neuen Version kannste erneut ändern, einfach sichern und austauschen ist ja nicht, weil du nie weißt, ob auch (sicherheitsrelevante) Änderungen in eben dieser Datei vorgenommen wurden.
 

CanTk

Nicht mehr ganz neu hier

AW: Wordpress - Widgets - fortlaufende ID vergeben

Hey danke euch allen für die Antworten.
Die widgets.php ist für mich schwierig zu erreichen, ausser wenn ich sie über die Functions.php des Themes 'patchen' könnte - dazu fehlt mir aber das Wissen in PHP - sollte dies überhaupt gehen.
Das Template soll ja im Endeffekt dem Endkunden geliefert werden und ist nicht nur für eine Installation ausgelegt, sonst hätte ich gleich eine einfache statische Sidebar angelegt.

Ich werde mir dann morgen mal cebitos Code genauer anschauen und mich mit jQuery auseinandersetzen.
Danke hierfür.
Gruß Can
 

Doitsu

Aktives Mitglied

AW: Wordpress - Widgets - fortlaufende ID vergeben

Wie ich im edit schon schreib, kannst du auch ohne Core das ganze machen.

Wenn du den gleichen Aufbau wie das Standard-Theme (Twenty Ten 1.0) hast muesstest du eine 'sidebar.php' haben, wo die Funktion 'dynamic_sidebar' aufgerufen wird. Daraus machst du jetzt einfach mal ein 'dynamic_sidebar2' ..

So, nun gehst du in deine functions.php und setzt dort folgende Funktion ein, die Funktionsweise ist aehnlich wie eben.

PHP:
function dynamic_sidebar2($index = 1, $id_prefix = 'my_id_') {
// $id_prefix wird benoetigt, falls die Funktion an mehreren Stellen aufgerufen werden soll, dann unbedingt immer einen anderen Praefix angeben, sonnst kommt es zu doppelten IDs!
	global $wp_registered_sidebars, $wp_registered_widgets;
	$nr = 1; // Hier setzen wir jetzt unsere Nummer ..
	
	if ( is_int($index) ) {
		$index = "sidebar-$index";
	} else {
		$index = sanitize_title($index);
		foreach ( (array) $wp_registered_sidebars as $key => $value ) {
			if ( sanitize_title($value['name']) == $index ) {
				$index = $key;
				break;
			}
		}
	}

	$sidebars_widgets = wp_get_sidebars_widgets();

	if ( empty($wp_registered_sidebars[$index]) || !array_key_exists($index, $sidebars_widgets) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) )
		return false;

	$sidebar = $wp_registered_sidebars[$index];

	$did_one = false;
	foreach ( (array) $sidebars_widgets[$index] as $id ) {

		if ( !isset($wp_registered_widgets[$id]) ) continue;

		$params = array_merge(
			array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),
			(array) $wp_registered_widgets[$id]['params']
		);

		// Substitute HTML id and class attributes into before_widget
		$classname_ = '';
		foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
			if ( is_string($cn) )
				$classname_ .= '_' . $cn;
			elseif ( is_object($cn) )
				$classname_ .= '_' . get_class($cn);
		}
		$classname_ = ltrim($classname_, '_');
		$params[0]['before_widget'] = sprintf($params[0]['before_widget'],$id_prefix . $nr, $classname_);
		$nr++; // Und unsere ID um 1 erhoehen!

		$params = apply_filters( 'dynamic_sidebar_params', $params );

		$callback = $wp_registered_widgets[$id]['callback'];

		do_action( 'dynamic_sidebar', $wp_registered_widgets[$id] );

		if ( is_callable($callback) ) {
			call_user_func_array($callback, $params);
			$did_one = true;
		}
	}
	return $did_one;
}

@cebito:
Gut, wenn es drin ist hast du natuerlich recht.. aber wie gesagt, ich hatte Wordpress noch nie benutzt, ich habe keine interessanten Dinge, die ich mit der Welt teilen koennte. :> Deswegen weiss ich nicht was da so alles eingebaut ist / werden kann.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.636
Beiträge
1.538.485
Mitglieder
67.559
Neuestes Mitglied
hanuta
Oben