Ciao, una prima dritta è quella di usare il tag [ code ] quando posti del codice sul forum, in modo che questo sia formattato correttamente una volta pubblicato (nota il pulsantino col cancelletto [#] nell'editor messaggi). Grazie.
Seconda cosa, non mi è chiaro il motivo dell'uso di quel .next() e tutto l'ambaradan che ci hai messo dentro come selettore. Non ho capito se devi cambiare il testo a due elementi diversi o se si tratta sempre di quell'elemento <a>; ma in tal caso mi pare ci sia qualche pasticcio.
Ad ogni modo il metodo .hide() pare non venga incluso nella coda dell'animazione per cui non è gestito dal .delay(), come è indicato sulla documentazione di cui riporto lo stralcio:
Only subsequent events in a queue are delayed; for example this will
not delay the no-arguments forms of .show() or .hide() which do not use the effects queue.
Fonte: https://api.jquery.com/delay/
Potrebbe essere questo il problema?
In qualunque caso, se si tratta di cambiare il testo in due o più passaggi, potresti utilizzare dei callback per il metodo fadeOut, così da eseguire i vari passaggi in modo sequenziale; cioè, terminato il primo fadeOut viene eseguito lo script che sta nel relativo callback, in cui magari viene eseguito il cambio del testo, impostato il delay e lanciato quindi un secondo fadeOut; quindi, terminato anche questo, viene eseguito lo script del suo eventuale callback, e così via.
Una cosa del genere (sempre se non abbia interpretato male ciò che stai cercando di fare):
codice:
$('.shop').click(function(){
$(this).fadeOut(500,function(){
$(this).text('Prodotto aggiunto').fadeIn(500).delay(3000).fadeOut(500,function(){
$(this).text('Aggiungi altro prodotto').fadeIn(500);
});
});
});