wp_query post casuale

23 ago 2017, 15:16:44
Visualizzazioni: 25.6K
Voti: 1

Voglio mostrare tutti i post come mywebsite.com/postname/1/, mywebsite.com/postname/2/ ...... mywebsite.com/postname/7/ ..

Il codice qui sotto funziona perfettamente per me, l'unico problema è che mostra solo i primi post mywebsite.com/postname/...

Come posso farlo?

<?php
/**
 * Nome Template: Post Casuale
 * Questo template mostrerà solo il contenuto inserito nell'editor della pagina
 */
?>

<html>
<head>

</head>
<body>

<?php
/*
Selettore Post Casuale
Usa sulla pagina per inviare il visitatore a un post casuale con query opzionale
*/

// imposta gli argomenti per WP_Query sui post pubblicati per ottenerne 1 casuale
$args = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'orderby' => 'rand',
    'order' => 'DESC',

    // Utilizzo di date_query per filtrare i post dell'ultima settimana
    'date_query' => array(
        array(
            'after' => '2 week ago'
        )
    )
); 

// È il momento! Vai in un posto casuale
$my_random_post = new WP_Query ( $args );

while ( $my_random_post->have_posts () ) {
  $my_random_post->the_post ();

  // reindirizza al post casuale
  wp_redirect ( get_permalink () );
  exit;
}
?>

</body>
</html>
3
Commenti

Tieni presente che ordinare per rand è estremamente lento e costoso e quella pagina non può essere memorizzata nella cache. Qualsiasi hacker vagamente competente può ora lanciare un attacco di denial of service economico pingando ripetutamente quell'URL, per abbattere il tuo server database tramite esaurimento delle risorse

Tom J Nowell Tom J Nowell
23 ago 2017 16:01:21

Penso che l'hacker avrà di meglio da fare dato che attaccare il mio server.it è solo un sito locale e non un sito di primo piano. Riguardo al "lento" non ci saranno più di 50-100 utenti online contemporaneamente. Possiamo comunque cambiare da "rand" a qualcos'altro. Prima devo farlo funzionare come voglio.

adi kica adi kica
23 ago 2017 16:23:49

Avevo in mente solo 4 o 5 utenti concorrenti quando ho scritto il mio commento, ma è un problema che può essere completamente evitato, la mia risposta qui sotto può scalare fino a miliardi di utenti concorrenti garantendo tempi di caricamento della pagina significativamente più veloci

Tom J Nowell Tom J Nowell
23 ago 2017 16:36:37
Tutte le risposte alla domanda 3
10

Fare questo in PHP è una pessima idea:

  • Questa pagina è impossibile da memorizzare nella cache
  • Ordinare in modo casuale è estremamente costoso per la query, poiché comporta la creazione di tabelle temporanee nel database e scansioni, dato che deve copiare l'intera tabella dei post, poi riordinarli casualmente, e infine eseguire la query effettiva sulla nuova tabella prima di distruggerla
  • Questo ti espone ad attacchi di esaurimento delle risorse

Ad esempio, questo comando eseguirà ripetutamente il ping del tuo URL di post casuale. Se eseguito abbastanza volte su abbastanza computer, farà cadere il tuo database:

for i in `seq 1 20000`; do curl http://miosito.com/nomepost; done

Se sei su un hosting condiviso economico, potrebbe essere sufficiente chiamare il tuo URL in diverse schede del browser contemporaneamente per causare problemi.

Per non parlare del fatto che il tuo reindirizzamento invia intestazioni HTTP, ma il codice emette tag in anticipo, quindi le intestazioni sono già state inviate, rompendo tutto e attivando avvisi PHP.

L'Alternativa Super Veloce e Facile

Quindi, invece, esegui una query normale ordinata per data e restituisci i dati come JSON. Poi in JavaScript sul browser, seleziona casualmente uno di quei post e fai un reindirizzamento lato client.

In questo modo la pagina può essere memorizzata nella cache, il tuo database è protetto e il browser fa tutto il lavoro pesante. La query del database sarà molto più veloce in confronto.

Ora il tuo problema si riduce a emettere un po' di dati in una lista, selezionare casualmente qualcosa dalla lista in JS, quindi usare window.location= ... per reindirizzare. Non è necessaria alcuna conoscenza di WP

23 ago 2017 16:11:09
Commenti

+1 per l'alternativa lato client. Ma una domanda: impostare random in WP_Query selezionerà un post casuale tra, diciamo, 15.000 post. Ma è efficiente inviare una risposta JSON contenente almeno 15K stringhe al browser?

Johansson Johansson
25 ago 2017 17:11:30

No, inviare 15k post non è efficiente, né lo è interrogare il database per 15k post. Qualsiasi operazione che coinvolga casualità e database sarà eccessivamente costosa. Invece, fornisci una scelta più intelligente, ad esempio i 20 post più recenti o i 20 post con più commenti. Ci sono così tante alternative al casuale quando si elencano i post, e raramente "casuale" significa ciò che le persone pensano. Se il sito restituisse lo stesso post 10 volte, sarebbe un output valido di una selezione veramente casuale, così come 5 post tutti di seguito, ma in realtà le persone intendono 10 post distribuiti uniformemente nell'intervallo

Tom J Nowell Tom J Nowell
25 ago 2017 19:56:04

Quindi, cosa suggerisci per un blog che ha migliaia di post? Impostare un offset casuale e poi interrogare 1 post è una buona idea?

Johansson Johansson
25 ago 2017 20:54:48

no, il mio suggerimento è di non provare a selezionare casualmente tra migliaia di post, nello stesso modo in cui prelevare 1 milione di sterline dalla banca è altrettanto costoso indipendentemente dal fatto che lo si faccia con carta, assegno o altri mezzi. Il casuale è una cattiva idea, il veramente casuale è ancora peggio, devi scendere a compromessi e dare l'aspetto della casualità, o limitare il tuo ambito. Ci sono un'enorme quantità di alternative che sembrano uguali, ottenere un numero veramente casuale da 15k post senza conoscerli tutti in anticipo è fondamentalmente costoso

Tom J Nowell Tom J Nowell
25 ago 2017 21:40:31

Interessante. Ma se l'utente sta visualizzando una versione memorizzata nella cache della pagina (page caching), non avrebbe importanza, giusto? Ovviamente, il post restituito in modo casuale rimarrà lo stesso finché la cache non viene svuotata. A meno che, ovviamente, in qualche modo il 'orderby' => 'rand' non attivi una cache frammentata...

Christine Cooper Christine Cooper
11 giu 2018 13:59:15

Sì, dovresti memorizzare nella cache solo quelle parti della pagina, a meno che non lo facessi in javascript, in ogni caso il casuale è un'idea terribile, e non significa mai quello che intendi comunque

Tom J Nowell Tom J Nowell
11 giu 2018 18:34:49

Ciao Tom, so che questo post è vecchio, ma potresti fornire un esempio con json? Non so nemmeno da dove iniziare.

rudtek rudtek
13 mar 2019 21:17:18

@rudtek qualsiasi endpoint REST API restituirà dati formattati in JSON, e JSON è lo stesso di oggetti e array in javascript, ad esempio [1,2,3,4,5] è JSON, è anche un array in javascript. Come scegliere un elemento casuale in un array in JS è una domanda per stackoverflow, e come decodificare una risposta JSON da una chiamata AJAX è anche una domanda per stackoverflow, così come come includere un array di elementi in una pagina HTML per l'uso in JS. Per tutto il resto, c'è json_encode, PHP standard vanilla. Onestamente c'è pochissimo WordPress coinvolto, se non del tutto

Tom J Nowell Tom J Nowell
13 mar 2019 22:17:30

C'è anche una via di mezzo in PHP: shuffle($my_random_post->posts) - se usato direttamente prima del loop - creerà anche un ordine "casuale" - ma nota che ordinare un gran numero di post CASUALMENTE sarà sempre molto costoso e può essere gestito meglio nel browser come suggerisce @TomJNowell!

jave.web jave.web
11 ago 2019 08:24:40

Anche in PHP è possibile mescolare i risultati, il costo consiste nel far gestire il random al database. Se riesci a spostare questa operazione altrove, che sia in PHP, nel browser o pre-calcolata, puoi ottenere significativi miglioramenti

Tom J Nowell Tom J Nowell
12 ago 2019 16:36:25
Mostra i restanti 5 commenti
6

Solo 1 articolo viene visualizzato sul tuo sito perché stai utilizzando exit() nel tuo loop. Nel tuo codice, quando WP_Query inizia e il loop termina dopo un conteggio. Rimuovi exit() e usa questo codice:

<?php
/*
 * Selettore casuale di articoli
 * Utilizza questa pagina per indirizzare i visitatori a un articolo casuale, opzionalmente modificando la query
 */

// imposta gli argomenti per WP_Query sugli articoli pubblicati per ottenerne 1 casuale
$args = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'orderby' => 'rand',
    'order' => 'DESC',

    // Utilizzando date_query per filtrare gli articoli delle ultime settimane
    'date_query' => array(
        array(
            'after' => '2 week ago'
        )
    )
);

// È il momento! Vai da qualche parte in modo casuale
$my_random_post = new WP_Query ( $args );
if($my_random_post->have_posts()){
    while ( $my_random_post->have_posts () ) {
        $my_random_post->the_post ();
        echo '<a href="'.get_the_permalink().'">'.get_the_title().'</a>';
    }
}
?>
23 ago 2017 15:50:20
Commenti

Voglio che venga visualizzato un solo post e che ci sia il reindirizzamento al post completo. Il template usa "mywebsite.com/random/,,,, quando il visitatore usa mywebsite.com/random/ voglio che l'utente venga reindirizzato al post completo, ma in modo casuale tra tutti i post, come ho spiegato " mywebsite.com/postname/15/..... e così via, il post è come una galleria, con "prossimo post" voglio che il visitatore venga reindirizzato casualmente a qualche numero di post, non solo al post.

adi kica adi kica
23 ago 2017 16:08:28

Vuoi reindirizzare l'utente a un'altra pagina.

Jitender Singh Jitender Singh
23 ago 2017 16:38:08

usando la mia pagina random reindirizzo gli utenti a post casuali. stesso dominio. mypage.com/random/ a mypage.com/somepost/ .... mypage.com/anotherpost/.... fino a questo punto è tutto ok, voglio di più.... > mypage.com/somepost/2/..mypage.com/somepost/3

adi kica adi kica
23 ago 2017 16:45:56

Scusa, non ho capito. Dimmi prima se questo permalink del codice non funziona o se vuoi cambiare il permalink dei post. Per favore, chiarisci il tuo compito.

Jitender Singh Jitender Singh
23 ago 2017 17:05:07

@adikica se stai facendo un reindirizzamento PHP => devi farlo PRIMA che venga emesso qualsiasi HTML... non nel mezzo del template - puoi usare un reindirizzamento javascript lato client, oppure usare l'azione template_redirect

jave.web jave.web
11 ago 2019 08:20:15

@adikica Inoltre, se chiami exit() dopo il primo post, non c'è loop - quindi usa semplicemente un'istruzione if

jave.web jave.web
11 ago 2019 08:21:00
Mostra i restanti 1 commenti
0

Non è necessario reindirizzare l'utente alla pagina del post casuale, e non potresti farlo anche se lo volessi, perché non è possibile essere reindirizzati a più luoghi contemporaneamente.

Quindi, semplicemente mostra i tuoi post casuali all'interno del tuo loop:

while ( $my_random_post->have_posts () ) {
  $my_random_post->the_post ();
  echo '<a href="'.get_the_permalink().'">'.get_the_title().'</a>';
}
23 ago 2017 15:36:03