Home › Forum › Problemi Vari con WP › Ancora sui custom field
-
AutorePost
-
-
28 Agosto 2011 alle 21:55 #18977TittiModeratore
La funzione the_meta() stampa i meta dati in una lista non ordinata, senza possibilità di controllo.
Io vorrei che il nome (key) di ogni custom field (con il suo relativo valore naturalmente) fosse mostrato nell’ordine in cui lo inserisco.
Ho cercato tanto, ho trovato qualche domanda di questo tipo ma nessuna valida risposta.
Non si può aggiungere a <?php the_meta(); ?> una cosa tipo sort = order… o orderby qualcosa, cioè un codice che permetta di stamparli nell’ordine di inserimento?
In mancanza di poterli mostrare in ordine di inserimento, mal che vada mi andrebbe anche bene in ordine alfabetico.
-
29 Agosto 2011 alle 8:52 #87827AndreamkPartecipante
Non utilizzare la funzione the_meta.
Ricavi i custom field utilizzando ,ad esempio, la funzione get_post_custom.
Poi li stampi secondo le tue esigenze.
Il problema dei custom field base di wordpress è che hanno solo la coppia di valori chiave => valore quindi non è possibile aggiungere dati addizionali come l’ordinamento.
Una soluzione non troppo elengante ma semplice è quella di aggiungere l’ordinamento nella chiave del custom field e poi in fase di visualizzazione mostrare solo la parte di chiave senza ordinamneto.
ad esempio se stabilisci che la chiave del custom field ha due parti divise da underscore
chiavecustomfield_ordinamento
Una volta che hai l’elenco di chiavi puoi esplodere la stringa controllare l’ordinamento e stampare solo la prima parte.
Altre soluzioni più complesse ma funzionali da lato amministrativo sono implementabili creando custom metabox.
Andrea
-
29 Agosto 2011 alle 12:23 #87832TittiModeratore
Il mio è un uso semplice. Si tratta di recensioni di libri, dove le chiavi possono essere diverse per ogni libro (=articolo), e in totale sono/saranno una decina di chiavi.
Ad esempio, è evidente che tutti i libri avranno in comune almeno la chiave ‘Casa Editrice’, molti avranno anche ‘Prefazione’, qualcuno avrà anche ‘Edizione originale’ e ‘Traduzione’, e qualcuno avrà anche una chiave che nessun altro ha.
Se uso <?php $custom_fields = get_post_custom(); ?> mi sembra che dentro quella parentesi ci vada l’ID del post del quale voglio stampare i custom field, ma non so che metterci perché io voglio i custom field creati per ogni articolo in tutti gli articoli, devo metterci tutti gli ID?
Qualora tra parentesi mettessi tutti gli ID degli articoli che hanno i custom fields, rimane che ogni articolo ha i suoi.
<?php
$custom_fields = get_post_custom(5745,5740,ecc...);
$my_custom_field = $custom_fields;
foreach ( $my_custom_field as $key => $value )
echo $key . " => " . $value . "";
?>E se là dove ho messo ‘Casa_Editrice’ aggiungo anche tutti gli altri custom fields nell’ordine che voglio, sempre che si possa, poi succede che ogni articolo che ha i c.f. mostrerà tutte le chiavi presenti, o no?
Inoltre, per ogni nuovo articolo con i c.f. dovrei aggiungere al codice l’ID e la chiave, se diversa, tutte le volte?
Questa cosa proprio non la capisco.
Credo che m’attiri di più la soluzione non-elegante, ma occorre che mi spieghi la cosa come se avessi quattro anni, con un esempio date le chiavi, perché in vita mia non ho mai fatto esplodere nessuna stringa
Ho capito che l’underscore può nascondere il dato che lo segue, ma non capisco come scrivere il tutto… né dove
-
29 Agosto 2011 alle 13:07 #87833AndreamkPartecipante
Io sinceramente non ho capito cosa vuoi fare …
vuoi stampare l’elenco dei custom field per ogni articolo o cosa ?
-
29 Agosto 2011 alle 13:20 #87834TittiModeratore
Sଠcerto, vorrei mostrare i custom field relativi ad ogni articolo, in un determinato ordine, o di inserimento, o alfabetico.
-
29 Agosto 2011 alle 14:57 #87838AndreamkPartecipante
Anzi tutto se a get_post_custom non passi il post id lui prende il post id corrente ad ogni modo dato un normale loop di articoli
ad esempio
if ( have_posts() ) while ( have_posts() ) : the_post();
the_title(); echo '';
the_content(); echo '';
$customFields = get_post_custom(); // in $customFields viene messo l'array dei valori custom
endwhile;
Per dovere completezza all’interno di un loop è comunque possibile prendere l’id del post corrente trarmite la variabile globale $post.
ad esempio
global $post;
if ( have_posts() ) while ( have_posts() ) : the_post();
the_title(); echo '';
the_content(); echo '';
$customFields = get_post_custom($post->ID); // questo è equivalente all'esempio precedente.
endwhile;
Ad ogni modo nel tuo caso per una maggiore semplicità del codice e di modifica io valuterei singolarmente ogni chiave che ti interessa
tramite la funzione get_post_meta
ad esempio
global $post;
if ( have_posts() ) while ( have_posts() ) : the_post();
the_title(); echo '';
the_content(); echo '';
$fieldKey = 'Casa Editrice';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'';
}
$fieldKey = 'Prefazione';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'';
}
$fieldKey = 'Traduzione';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'';
}
$fieldKey = 'Edizione originale';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'';
}
// ecc ecc ...
endwhile;
Tieni conto che le chiavi dei field devono essere esattamente scritte come le scrivi nel layout con questo sistema e devi conoscere a priori quali andrai a inserire.
Non è molto elengante ma è il modo più semplice per gestire l’ordinamento senza conoscere troppo bene php
perchè le chiavi vengono stampate nell’ordine in cui vengono valutate nel codice.
Per una maggiore pulizia del sorgente aggiungerei una funzione dentro functions.php
function print_custom_field($fieldKey) {
$fieldKey = 'Traduzione';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'';
}
}
E il nostro loop diventerà …
global $post;
if ( have_posts() ) while ( have_posts() ) : the_post();
the_title(); echo '';
the_content(); echo '';
print_custom_field('Casa Editrice');
print_custom_field('Prefazione');
print_custom_field('Traduzione');
print_custom_field('Edizione originale');
// ecc ecc ...
endwhile;
p.s. Purtroppo questo forum fa dei macelli con il codice tutti gli echo vuoti avrebbero dentro un br per andare a capo.
-
29 Agosto 2011 alle 15:09 #87839TittiModeratore
Studierò le diverse soluzioni che hai proposto
Grazie mille Andrea, sei stato davvero molto gentile
-
29 Agosto 2011 alle 21:45 #87844TittiModeratore
Grande, funziona! Dopo qualche prova sono riuscita con questo codice:
(inserito nel single.php tra < div class=”content”> e < ?php the_content();? > :
<?php
global $post;
$fieldKey = 'Casa Editrice';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'< br/>';
}
$fieldKey = 'Edizione originale';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'< br/>';
}
$fieldKey = 'Edizione aggiornata';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'< br/>';
}
$fieldKey = 'Prefazione';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo $fieldKey.': '.$fieldVal.'< br/>';
}
//tralascio gli altri fieldKey, in totale saranno 8
?>La posizione è quella giusta e l’ordine è quello deciso da me, ci sarà la scocciatura di aggiungere eventualmente dei nuovi dati che non posso sapere prima (dipende dal libro), ma le voci più comuni ci sono già e non ce ne saranno molte altre.
Certo è meno elegante ed è tanto codice in più rispetto a php_the_meta, ma l’ho voluto io e adesso me lo tengo, proverò poi ad aggiungere la funzione “pulitrice” che gentilmente mi hai suggerito.
Le altre soluzioni non sono riuscita a farle funzionare, ma ci riproverò.
Il problema ora sono i CSS, non so che nome dare.
Ho provato ad aggiungere/sostituire post-meta con fieldKey, ma forse non è il nome da dare o non l’ho scritto nel modo giusto.
Attualmente sono cosà¬:
.post-meta {color: #707070; font-size: 100%; font-family:”Palatino Linotype”, “Book Antiqua”, Palatino, serif;}
.post-meta-key {color: #a63939; font-weight: bold; font-size: 100%;}
Grazie di nuovo
-
30 Agosto 2011 alle 6:48 #87845AndreamkPartecipante
Se vuoi dare degli stili ovviamente devi aggiungere dei tag html … ad esempio
$fieldKey = 'Casa Editrice';
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo '< div class="postField">< span class="key">'.$fieldKey.': < /span><span class="value">'.$fieldVal.'< /span>< /div>';
}
.postField {color: #707070; font-size: 100%; font-family:”Palatino Linotype”, “Book Antiqua”, Palatino, serif;}
.postField .key {color: #a63939; font-weight: bold; font-size: 100%;}
Visto che la stampa di ogni campo si complica e se vuoi modificarla devi ripetere le modifiche tutte le volte ti consiglio vivamente di fare una funzione unica
e chiamarla per ogni field come ti avevo mostrato nell’ultimo esempio con una piccola correzzione visto che avevo scritto male.
La funzione diventerà …
function print_custom_field($fieldKey) {
global $post;
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo '< div class="postField">< span class="key">'.$fieldKey.': < /span><span class="value">'.$fieldVal.'< /span>< /div>';
}
}
e verrà chiamata cosi …
print_custom_field('Casa Editrice');
print_custom_field('Edizione originale');
// ecc ecc ...
-
30 Agosto 2011 alle 8:44 #87846TittiModeratore
Perfetto, i CSS e tutto il resto.
Ho inserito la funzione come consigliato e sostituita la chiamata, ora è molto più breve e pulito, e se dovrò aggiungere mi basterà mettere… print_custom_field(”); nell’ordine che voglio.
Grazie mille per avermi aiutata e insegnato qualcosa.
-
30 Agosto 2011 alle 9:42 #87855AndreamkPartecipante
Di nulla comunque imparare un pò di php se si vuole mettere mano ai temi non guasterebbe.
http://php.html.it/guide/leggi/99/guida-php-di-base/
questa guida fornisce le basi ed è piuttosto semplice.
Ad esempio la funzione che hai fatto potrebbe evolversi per prendere come parametro un array di chiavi …
function print_custom_field($fieldKeys) {
if (!is_array($fieldKeys)) { // se non è un array
$fieldKeys = array($fieldKeys); // lo trasformo in array
}
global $post;
foreach ($fieldKeys as $fieldKey) { // valuto ogni chiave nell'array
$fieldVal = get_post_meta($post->ID , $fieldKey , true);
if (!empty($fieldVal)) { // controllo se il field esiste se no lo salto
echo '< div class="postField">< span class="key">'.$fieldKey.': < /span><span class="value">'.$fieldVal.'< /span>< /div>';
}
}
}
In questo modo se alla funzione viene passato un array valuta ogni chiave singolarmente ma continua ad accettare anche valori singoli.
Quindi la chiamata diventerebbe
print_custom_field(array('Casa Editrice','Edizione originale','Edizione aggiornata','Prefazione'));
-
30 Agosto 2011 alle 12:02 #87854PaleosetiPartecipante
Di nulla comunque imparare un pò di php se si vuole mettere mano ai temi non guasterebbe.
http://php.html.it/guide/leggi/99/guida-php-di-base/
questa guida fornisce le basi ed è piuttosto semplice.
Andrea scusa se mi permetto di chiedertelo qui ma non sapevo come altro fare: puoi contattarmi che ti vorrei proporre un lavoro? Riguardo a quello che stavate discutendo con Titti…
Grazie, attendo un tuo contatto e ti spiegherò di cosa avrei bisogno per il blog che trovi collegato alla firma…
Teodoro
-
31 Agosto 2011 alle 7:57 #87863TittiModeratore
In questo modo se alla funzione viene passato un array valuta ogni chiave singolarmente ma continua ad accettare anche valori singoli.
Ottimo, grazie
-
31 Agosto 2011 alle 17:30 #87874AndreamkPartecipante
Di nulla comunque imparare un pò di php se si vuole mettere mano ai temi non guasterebbe.
http://php.html.it/guide/leggi/99/guida-php-di-base/
questa guida fornisce le basi ed è piuttosto semplice.
Andrea scusa se mi permetto di chiedertelo qui ma non sapevo come altro fare: puoi contattarmi che ti vorrei proporre un lavoro? Riguardo a quello che stavate discutendo con Titti…
Grazie, attendo un tuo contatto e ti spiegherò di cosa avrei bisogno per il blog che trovi collegato alla firma…
Teodoro
Sempre pronto a valutare un lavoro.
Ho li da un anno il mio sito personale in costruzione ho colto la palla al balzo per aggiungere un form contatti visto che non ho capito
come contattarti.
http://amkdeveloper.net/contatti/
Comunque la soluzione illustrata a titti è piuttosto dozzinale e semplice da implementare.
Per lavorare bene con i custom field e creare delle interfacce user friendly bisogna lavorare con i metabox personalizzati.
A presto
Andrea
-
31 Agosto 2011 alle 23:58 #87888PaleosetiPartecipante
Sempre pronto a valutare un lavoro.
Ho li da un anno il mio sito personale in costruzione ho colto la palla al balzo per aggiungere un form contatti visto che non ho capito
come contattarti.
http://amkdeveloper.net/contatti/
Comunque la soluzione illustrata a titti è piuttosto dozzinale e semplice da implementare.
Per lavorare bene con i custom field e creare delle interfacce user friendly bisogna lavorare con i metabox personalizzati.
A presto
Andrea
Eheheheh, scusa hai ragione, sul blog devi trovare la pagina “contattaci” per avere il mio indirizzo email
Ok, ti scrivo tramite il tuo sito…devo spiegarmi bene su cosa vorrei fare e perchè ancora non ci son riuscito…
A presto
Teo
Ps: chiudo l’OT e chiedo scusa
-
1 Settembre 2011 alle 7:10 #87882AndreamkPartecipante
tramite il form inviami la mail poi ti fornisco i contatti come mail e skype cosi comunichiamo meglio.
-
1 Settembre 2011 alle 13:58 #87894TittiModeratore
Niente è dozzinale se raggiunge lo scopo
Infatti, lo specificare meglio il codice per i custom field ha dato indirettamente i suoi frutti. Sembra risolto anche il problema che lamentavo qua, anche se forse è presto per dirlo ma pare di sà¬, compresi dati SEO e immagine in evidenza.
Ora sono quasi sicura che anche questo problema deriva dalla stessa fonte, per saperlo dovrei reinstallare PSP.
Però a questo punto mi chiedo:
1) Perché WP fornisce un codice base (mi riferisco alla funzione the_meta()) cosଠgenerico per mostrare i c.f., tale da poter essere interpretato dal sistema in più modi, cosଠimpreciso e, in questo caso sà¬, davvero “dozzinale”, dato che potenzialmente può creare tanti problemi?
2) Perché WP non inserisce direttamente nel core un codice un pochino più evoluto senza bisogno di essere richiamato nel tema, per far sଠche chi vuole usare i c.f. in modo basico lo possa fare direttamente pensando solo ad inserire i dati nell’editor, dando la possibilità di scegliere la posizione (prima o dopo l’articolo) con un’opzione?
Poi, se uno vuole, può implementare altri usi più complessi usando i c.f. evolvendo la funzione per conto suo dal tema, ma intanto l’utente medio potrebbe usare i c.f. senza incorrere in problemi di metadati impazziti che, tra l’altro, nessuno sa risolvere direttamente, date le risposte o le non-risposte che ho trovato nei vari supporti.
-
1 Settembre 2011 alle 14:59 #87897AndreamkPartecipante
Niente è dozzinale se raggiunge lo scopo
…
1) Perché WP fornisce un codice base (mi riferisco alla funzione the_meta()) cosଠgenerico per mostrare i c.f., tale da poter essere interpretato dal sistema in più modi, cosଠimpreciso e, in questo caso sà¬, davvero “dozzinale”, dato che potenzialmente può creare tanti problemi?
Quando scrivevo di dozzinale mi riferivo proprio all’utilizzo dei custom field nudi e crudi. I
2) Perché WP non inserisce direttamente nel core un codice un pochino più evoluto senza bisogno di essere richiamato nel tema, per far sଠche chi vuole usare i c.f. in modo basico lo possa fare direttamente pensando solo ad inserire i dati nell’editor, dando la possibilità di scegliere la posizione (prima o dopo l’articolo) con un’opzione?
Poi, se uno vuole, può implementare altri usi più complessi usando i c.f. evolvendo la funzione per conto suo dal tema, ma intanto l’utente medio potrebbe usare i c.f. senza incorrere in problemi di metadati impazziti che, tra l’altro, nessuno sa risolvere direttamente, date le risposte o le non-risposte che ho trovato nei vari supporti.
I custom field non li considererei delle cose per utente medio. L’utente medio scrive tutto nel corpo dell’articolo e pace.
Ad ogni modo se vuoi fare la beta tester posso inviarti un plugin che ti risolve tutto e molto di più.
Andrea
-
1 Settembre 2011 alle 15:15 #87898TittiModeratore
Ad ogni modo se vuoi fare la beta tester posso inviarti un plugin
Uhmmm… non saprei, l’idea non mi entusiasma
In effetti do l’idea di essere quella in grado di scatenare guai che nessuno ha e che nessuno potrebbe immaginare
che ti risolve tutto e molto di più
Per il momento sono contenta cosà¬, dato che credevo che avrei convissuto per sempre con i metadati impazziti visto che non rinuncerei ai c.f.
In ogni caso sono curiosa, che fa di bello questo plugin, se si può dire?
-
1 Settembre 2011 alle 15:45 #87901AndreamkPartecipante
In ogni caso sono curiosa, che fa di bello questo plugin, se si può dire?
E’ una gui completa che consente di creare custom posts , custom taxonomies custom metabox a cui è possibile associare un numero variabile di custom field di vario tipo.
dal semplice testo, ai radio button, checkbox, text area ,campi di tipo data ecc ecc.
Inoltre ha sistema di estensioni con cui è possibile estendere le funzionalità di questo plugin … una sorta di plugin per plugin.
E’ in sviluppo da non so quanti mesi perchè tirato su parallelamente ai miei siti. Prima o poi vedrà la luce.
-
2 Settembre 2011 alle 10:35 #87907zhenyaPartecipante
@ Titti
Se rivedi il vecchio 3ad su Platinum SEO Pack qui:::
http://www.wpitaly.it/forum/topic.php?id=21669
Ti avevo suggerito di usare get_post_meta al posto di the_meta .. E pensavo lo avessi fatto..)
-
2 Settembre 2011 alle 10:51 #87908TittiModeratore
Ciao Zhenya, ricordo benissimo e anzi immaginavo che avresti detto qualcosa, soprattutto perché poco più su ho linkato anche quel topic (linkato anche per riportare il tuo intervento nel caso).
Anche se non ho messo in pratica subito i tuoi consigli (oltre che forse non ero in grado cosଠsu due piedi) mi sono stati comunque utili per cominciare a capire che forse sarei dovuta andare un po’ più a fondo nella faccenda dei custom fields, ma soprattutto per legare insieme tutti quei problemi ho avuto bisogno di tempo (e di una buona dose di casualità ), e in quel topic in particolare il problema l’avevo poi risolto tornando ad AIO.
C’era poi il problema del tema, dove non funzionava bene la faccenda “uso plugin di terze parti” (anche se questo non c’entra con i c.f.), e ho dovuto insistere un po’ con l’autore e far saltar fuori altri casi sul forum perché si convincesse ch’era un bug, proprio oggi è arrivato il “fix” del tema.
Ringrazio entrambi perché senza di voi non ce l’avrei fatta
-
-
AutorePost
- Devi essere connesso per rispondere a questo topic.