Adicionar uma próxima postagem aleatória no modelo de página do WordPress usando SQL
Muitas vezes você pode obter conselhos sobre como melhorar o SEO (Search Engine Optimization) adicionando links às suas postagens anteriores ao publicar uma nova postagem. Isso ajuda a aumentar o tráfego e funciona de forma semelhante a plugins como ‘Posts Relativos’, mas apenas mais simples.
Todas as postagens do wordpress são armazenadas na tabela, por exemplo, wp_posts e dentro desta tabela, você encontrará post_title, post_name e essas colunas são bastante diretas. Dependendo das configurações de seus URLs de postagem, você pode ter vários formatos de permalinks que podem ser configurados na seção Configurações – Permanlink.
O código PHP a seguir pode ser inserido em seu modelo de página, normalmente single.php que é o modelo de postagem única ou page.php para modelo de página.
global $wpdb; // include the $wpdb
$query = "select `post_title` as `title`, `post_name` as `name` from `wp_posts` where `post_type`='post' and `post_status`='publish' order by rand() limit 1";
$results = $wpdb->get_results($query); // run the query on the database
if ($results) {
$domain = $_SERVER['SERVER_NAME'];
foreach ($results as $toppost) {
echo "<a href="<a class="vglnk" target="_blank" href="http://$domain/".$toppost-" rel="nofollow"><span>http</span><span>://$</span><span>domain</span><span>/".$</span><span>toppost</span><span>-</span></a>>name."/"><img title="Next Post: ".$toppost->title."" src="<a class="vglnk" target="_blank" href="https://helloacm.com/static/nextpost2.png" rel="nofollow"><span>https</span><span>://</span><span>helloacm</span><span>.</span><span>com</span><span>/</span><span>static</span><span>/</span><span>nextpost2</span><span>.</span><span>png</span></a>" alt="Next Post: ".$toppost->title."" /></a>";
}
}
Altere wp_posts de acordo, pois isso pode variar um pouco. A consulta SQL retorna um post aleatório onde exclui as páginas, ou menu_items, links etc. E o status do post deve ser publicado o que exclui o rascunho. O limite 1 retorna apenas 1 post. Portanto, se você quiser uma postagem anterior, considere alterar isso para limitar 2.
O permalink no meu site é baseado no post_name, que é mais amigável para SEO. Você pode muito bem personalizar isso. A consulta SQL também pode ser personalizada. Por exemplo, você pode querer retornar postagens relevantes em vez de postagens aleatórias, correspondendo o titlevalor de acordo com o título da postagem atual. Ou você realmente deseja retornar sua postagem anterior ou seguinte classificada por data de publicação, você pode usar o campo ‘post_id’.
Comentários
Yu – “Legal, aleatório é muito bom. Também é melhor garantir que o aleatório esteja relacionado ao post atual. Mas isso geralmente não é um grande problema, desde que o blog seja para um único gênero.
Além disso, a ordem por RAND() funciona bem para milhares de registros. (geralmente o caso de um blog normal). Mas ele queimará seu banco de dados se você tiver milhões de registros na mesma tabela que correspondam aos critérios de pesquisa."
Sim, a ordem SQL por rand() é um pouco complicada e lenta. Ele precisa buscar todos os registros e classificados aleatoriamente. É considerada baixa eficiência quando o tamanho da mesa é médio ou grande. Você pode usar o seguinte truque para obter um registro aleatório de maneira mais rápida, empregando a função rand() no PHP.
// get total number of records
$query = "select count(1) from `table`";
$result = mysql_query($query) or die(mysql_error());
$total = mysql_result($result, 0, 0);
// get a random
$r = rand(0, $total - 1);
// return a number between 0 and $total - 1 inclusive using PHP
$query = "select * from `table` limit $r, 1";
$result = mysql_query($query) or die(mysql_error());
As causas do limite SQL especificam o deslocamento e o segundo parâmetro especifica o número de registros a serem buscados.
Melhor registro aleatório
De acordo com o acima, a ordem por rand() é extremamente ineficiente se você tiver uma tabela muito grande porque para a ordenação (mesmo que você queira apenas um item), a função rand() será invocada e é isso que não queremos querer. Podemos melhorar o acima usando duas consultas, a primeira retorna o número total de postagens, e temos uma função aleatória do PHP e obtemos o registro aleatório usando a instrução limit.
global $wpdb; // include the $wpdb
$query= "select count(1) from `wp_posts` where `post_type`='post' and `post_status`='publish'";
$cnt = $wpdb->get_var($query); // run the query on the database and return single variable
$rand = mt_rand(0, $cnt - 1);
$query= "select `post_title` as `title`, `post_name` as `name` from `wp_posts` where `post_type`='post' and `post_status`='publish' limit $rand,1";
$results = $wpdb->get_results($query); // run the query on the database
// the rest are the same