Jump to content
  • 0

Помогите решить проблему php


Mila
 Share

Question

У меня на сайте выводится случайный анонс с помощью php и ajax.

Выглядит это так:

Название записи, картинка из нее и анонс этой записи.

Под анонсом ссылка "Следующая статья".

При клике по этой ссылке появляется следующий анонс без перезагрузки страницы.

Проблемы с этим две:

- при клике по ссылке меняется картинка и анонс, но не меняется название записи.

т.е. при первом клике, появляется название следующей записи, а при последующих кликах по ссылке название уже не меняется.

- код вывода находится в файле header.php, в самом начале файла до вывода всего прочего, а это по некоторым причинам неудобно.

При переносе кода в другие файлы, он перестает работать.

Вот сам код:

<?php
if(isset($_GET['rand_post_ajax'])){get_random_post();exit;}
function get_random_post($limit=1)
{
if(isset($_GET['num']))$ca_num=$_GET['num'];else $ca_num=1;
$cat_id=$_GET['cat'];
if(empty($cat_id)){$cat_id=get_the_category();$cat_id=$cat_id[0]->cat_ID;};
$myposts = get_posts('numberposts=20&order=ASC&orderby=post_date&cat=23');
#shuffle($myposts);
foreach($myposts as $post) : setup_postdata($post);
$title = $post->post_title;
$count++;
if($count<$ca_num)continue;
?>
<h3><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title() ?></a></h3>
<?php $thumb = get_post_meta($post->ID, 'postimage', $single = true); ?>
<?php
if($thumb !== '') { ?>
<a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><img src="<?php bloginfo('stylesheet_directory'); ?>/timthumb.php?src=<?php echo $thumb; ?>&h=80&w=140&q=50&zc=1" alt="<?php if($thumb_alt !== '') { echo $thumb_alt; } else { echo the_title(); } ?>" class="img-left" /></a>
<?php }
else { echo ''; } ?>
<?php the_content_limit(170); ?>
<?php if($count>=$limit)break; ?>
<?php endforeach;
if(sizeof($myposts)<=$ca_num)$ca_num=0;
$ca_num+=1;
?>
<br />
<a href="java script:;" onclick="$(this).html('Загрузка...');$('#ajax_rand_post').load('?num=<?=$ca_num; ?>cat=<?=$cat_id; ?>&rand_post_ajax');" id="m_rand315">Следующая запись</a>
<?php } ?>

Это вывод анонса записи в сайдбаре:

<div id="ajax_rand_post">
<?php get_random_post(); ?>
</div>

Пожалуйста, помогите это исправить.

Edited by Mila
Link to comment
Share on other sites

18 answers to this question

Recommended Posts

  • 0

А где код AJAX? Не могу найти что-то.

Нашёл. Но это jQuery, нам с ним не по пути.) А, вообще, нужно отформатировать код - невозможно читать.

function get_random_post($limit=1) :P или я не понял.

Edited by ZI DAN
Link to comment
Share on other sites

  • 0

За форматирование спасибо.

<?php
if (isset ($_GET['rand_post_ajax']))
{
get_random_post();
exit;
}
function get_random_post($limit = 1)
{
if (isset ($_GET['num']))
$ca_num = $_GET['num'];
else
$ca_num = 1;
$cat_id = $_GET['cat'];
if (empty ($cat_id))
{
$cat_id = get_the_category();
$cat_id = $cat_id[0]->cat_ID;
}
;
$myposts = get_posts('numberposts=20&order=ASC&orderby=post_date&cat=23');
#shuffle($myposts);
foreach ($myposts as $post) :
setup_postdata($post);
$title = $post->post_title;
$count++;
if ($count < $ca_num)
continue;
?>
<h3><a href="
<?php
the_permalink()
?>
" rel="bookmark" title="
<?php
the_title();
?>
">
<?php
the_title()
?>
</a></h3>
<?php
$thumb = get_post_meta($post->ID, 'postimage', $single = true);
?>
<?php
if ($thumb !== '')
{
?>
<a href="<?php the_permalink() ?>" title="
<?php
the_title();
?>
"><img src="
<?php
bloginfo('stylesheet_directory');
?>
/timthumb.php?src=
<?php
echo $thumb;
?>
&h=80&w=140&q=50&zc=1" alt="
<?php
if ($thumb_alt !== '')
{
echo $thumb_alt;
}
else
{
echo the_title();
}
?>
" class="img-left" /></a>
<?php
}
else
{
echo '';
}
?>
<?php
the_content_limit(170);
?>
<?php
if ($count >= $limit)
break;
?>
<?php
endforeach;
if (sizeof($myposts) <= $ca_num)
$ca_num = 0;
$ca_num += 1;
?>
<br />
<a href="java script:;" onclick="$(this).html('Загрузка...');$('#ajax_rand_post').load('?num=<?=$ca_num;?>cat=<?=$cat_id;?>&rand_post_ajax');" id="m_rand315">Следующая запись</a>
<?php }?>

Только от этого работать лучше не стало.

ZI DAN, можно и без jQuery, лишь бы работало.

Link to comment
Share on other sites

  • 0

какая куча лишних скобок. Если в строке один этот... операнд что ли, то фигурные скобки не нужны

<?php

echo $thumb;

?> вообще можно заменить на <?=$thumb?>, только short_tags включить

Да и слишком тут много всего, на глаз ошибку сразу не найдёшь, а у себя это всё запускать, да ещё аякс прикручивать слишком муторно.

get_posts() вот тоже непонятно откуда берётся же.

Link to comment
Share on other sites

  • 0
Люди, ау!

Помогите исправить ошибку, плиз...

Людям неудобно помогать вам владея теми данными, что вы предоставили, такие вещи проще решать и обкатывать уже на самом сайте. А теоретические советы вам вряд ли помогут(зная ваши познания в данном материале). Рекомендую промотивировать людей на это в коммерческой рубрике.

Link to comment
Share on other sites

  • 0
- при клике по ссылке меняется картинка и анонс, но не меняется название записи.

т.е. при первом клике, появляется название следующей записи, а при последующих кликах по ссылке название уже не меняется.

возможно дело в лимите?

function get_random_post($limit = 1)

Link to comment
Share on other sites

  • 0
А теоретические советы вам вряд ли помогут(зная ваши познания в данном материале).

Рекомендую промотивировать людей на это в коммерческой рубрике.

Уже промотивировала.

Эта функция обошлась мне в 20$. А теперь, оказалось, что она не работает.

Вообще, я немного подправила код так, что теперь вроде работает, но выводятся все статьи сразу, хотя $limit=1

<?php
if(isset($_GET['rand_post_ajax'])){get_random_post();exit;}
function get_random_post($limit=1)//$limit - сколько статей выводить , можно изменять
{
if(isset($_GET['num']))$ca_num=$_GET['num'];else $ca_num=1;
$cat_id=$_GET['cat'];
if(empty($cat_id)){$cat_id=get_the_category();$cat_id=$cat_id[0]->cat_ID;};

$rc_posts = get_posts('category=23&orderby=rand');
foreach($rc_posts as $rc_post){
echo '<div class="title"><a href="' . get_permalink($rc_post) . '">' . get_the_title($rc_post) . '</a></div>';
echo '<a href="' .get_permalink($rc_post). '"><img class="image" src="'.get_post_meta($rc_post->ID, 'image', true).'" width="250" height="180" alt="" /></a>';
}
?>
<?php if($count>=$limit)break;
if(sizeof($myposts)<=$ca_num)$ca_num=0;
$ca_num+=1;
?>
<br>
<a href="java script:;" onclick="$(this).html('Загрузка...');$('#ajax_rand_post').load('?num=<?=$ca_num; ?>cat=<?=$cat_id; ?>&rand_post_ajax');" id="m_rand315">Следующая запись</a>
<?php } ?>

Как бы ограничить вывод одним анонсом?

Link to comment
Share on other sites

  • 0
Уже промотивировала.

Эта функция обошлась мне в 20$. А теперь, оказалось, что она не работает.

А почему же вы заплатили не добившись от исполнителя работоспособности скрипта? (вопрос риторический)

Вообще, я немного подправила код так, что теперь вроде работает, но выводятся все статьи сразу, хотя $limit=1

$rc_posts = get_posts('category=23&orderby=rand');

Как бы ограничить вывод одним анонсом?

Любопытно что в первоначальной версии которую вы выкладывали, параметры функции выглядят более расширено:

$myposts = get_posts('numberposts=20&order=ASC&orderby=post_date&cat=23');

подозреваю что: numberposts=20 является количеством анонсов, пробовали варьировать эту величину ?

Link to comment
Share on other sites

  • 0
А почему же вы заплатили не добившись от исполнителя работоспособности скрипта? (вопрос риторический)

Потому, что заказ был большой.

Конечно я проверяла, вроде все работало нормально, но по-видимому эту часть работы проверила невнимательно.

Вообще то, у программиста, с которым я имела дело был такой недостаток - он часто присылал недоделанную работу.

Поэтому я ним и перестала сотрудничать и сейчас ищу кого-нибудь более добросовестного.

подозреваю что: numberposts=20 является количеством анонсов, пробовали варьировать эту величину ?

numberposts=20 - это количеством анонсов, выводимых в цикле,

а $limit=1, это количество видимых пользователю записей.

При клике по кнопке "Следующая запись" должна появится следующая запись, выводимая в этом цикле.

Вместо 20 можно поставить 10 или 50. На результат это не влияет.

Тут проблема не с общим количеством записей, а с количеством именно отображаемых записей.

Отображаться должна одна запись, по клику должна появляться следующая и т.д.

А отображаются почему то сразу все 20.

Link to comment
Share on other sites

  • 0

Ну если бы знать откуда конкретно берутся и что к чему...

Вообще я так понимаю что вот эта строка

$rc_posts = get_posts('category=23&orderby=rand');

Ответственна за получение контента, попробуйте написать так:

$rc_posts = get_posts('numberposts=1&category=23&orderby=rand');

вместо 1 можно подставить ваш $limit

Link to comment
Share on other sites

  • 0

Подставила.

Теперь выводится только один анонс и следующий не загружается, поскольку браться ему неокуда - в цикле теперь выводится только один пост.

Вернулась к старому варианту:

<?php
if(isset($_GET['rand_post_ajax'])){
get_random_post();exit;
}
function get_random_post($limit=1)//$limit - сколько статей выводить , можно изменять
{
if(isset($_GET['num']))$ca_num=$_GET['num'];
else $ca_num=1;
$cat_id=$_GET['cat'];
if(empty($cat_id)){
$cat_id=get_the_category();
$cat_id=$cat_id[0]->cat_ID;};

$myposts = get_posts('numberposts=20&order=ASC&orderby=post_date&&cat=23');
#shuffle($myposts);
foreach($myposts as $post) : setup_postdata($post);
$title = $post->post_title;
$count++;
if($count<$ca_num)continue;
?>
<a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title() ?></a>
<?php the_content_limit(350); ?>

<?php if($count>=$limit)break; ?>

<?php endforeach;
if(sizeof($myposts)<=$ca_num)$ca_num=0;
$ca_num+=1;
?>
<br>
<a href="java script:;" onclick="$(this).html('Загрузка...');$('#ajax_rand_post').load('?num=<?=$ca_num; ?>cat=<?=$cat_id; ?>&rand_post_ajax');" id="m_rand315">еще</a>
<?php } ?>

Здесь проблема только в том, что не работает смена названий записи.

Т.е. сама запись меняется, а название нет.

Мне кажется, ошибка где то в этой части:

$count++;

if($count<$ca_num)continue;

Link to comment
Share on other sites

  • 0

Честно признаться не силен не в том не в другом, но попробовал разобраться, на сколько хватило знаний и ума.

На сколько я понял это wordpress в чистом виде без примесей сторонних функций.

1.Хотелось бы понять для чего мы получаем num and cat_num ??

Единственное применение это для формирования линка на аякс запрос, но согласитесь глупо формировать линк из полученных данных, которые в свою очередь передаются через этот же сформированный линк.

	if (isset ($_GET['num']))
$ca_num = $_GET['num'];
else
$ca_num = 1;

$cat_id = $_GET['cat'];
if (empty ($cat_id))
{
$cat_id = get_the_category();
$cat_id = $cat_id[0]->cat_ID;
}

2.$limit - вообще по ходу во всем этом лишний т.к. все это можно регулировать numberposts.

3.$myposts = get_posts('numberposts=20&order=ASC&orderby=post_date&&cat=23');

order=ASC - сортировка в порядке возрастания (снизу вверх), можно не указывать ибо по умолчанию.

&& - опечатка.

для формирования произвольных статей можно использовать orderby=rand.

Вывод:

Можно записать так.

$myposts = get_posts('numberposts=1&orderby=rand&cat=3');

Если не указывать cat будет выводить произвольную статью из произвольной категории.

Дальше соответственно делаем вывод:

У меня получилось следующее.

foreach ($myposts as $post)
{
?>
<div id="post-<?php echo $post->ID; ?>">
<h2 class="entry-title"><a href="<?php echo $post->guid; ?>" title="<?php echo $post->post_title; ?>" rel="bookmark"><?php echo $post->post_title; ?></a></h2>
<div class="entry-content">
<?php echo $post->post_content; ?>
</div>
</div>
<?php
}
?>

4."Следующая статья" - не совсем понятно следующая статься по этой категории ? или очередная рандомная статься ?

судя по формированию линка:

<a href="java script:;" onclick="$(this).html('Загрузка...');$('#ajax_rand_post').load('?num=<?=$ca_num; ?>cat=<?=$cat_id; ?>&rand_post_ajax');" id="m_rand315">еще</a>

она должна быть и рандомной и в той категории в которой выпал/передался первый рандом.

5.непонятно как все это оказалось в header.php, за контент отвечает loop.php (у стандартного шаблона).

Итого:

Если я правильно понял поставленную задачу, а понял я ее следующим образом:

1.При входе на страницу у меня должна выводиться рандомная статья.

2.При клике на загадочную кнопку "Следующая статья" - у меня должна вывестись любая рандомная статья.

<?php
if (isset ($_GET['rand_post_ajax']))
{
$myposts = get_posts('numberposts=1&orderby=rand');

foreach ($myposts as $post)
{
?>
<div id="post-<?php echo $post->ID; ?>">
<h2 class="entry-title"><a href="<?php echo $post->guid; ?>" title="<?php echo $post->post_title; ?>" rel="bookmark"><?php echo $post->post_title; ?></a></h2>
<div class="entry-content">
<?php echo $post->post_content; ?>
</div>
<div><a href="java script:;" onclick="$(this).html('Загрузка...');$('#ajax_rand_post').load('?rand_post_ajax');" id="m_rand315">еще</a></div>
</div>
<?php
}
}
?>

Link to comment
Share on other sites

  • 0

Scrum, к сожалению ваш код ничего не выводит.

Я заменила в нем вывод названий и анонсов стандартными wordpress-функциями, но и это не помогло.

Что касается хода ваших рассуждений:

1. numberposts= - это количеством анонсов, которые загружаются (выводятся в цикле foreach),

а $limit=1, это количество видимых пользователю записей.

Если numberposts=1 - значит в цикле будет загружаться 1 анонс,

и значит при клике по кнопке "Следующая запись" эта следующая запись не появится.

Откуда ей взяться, если цикл foreach вывел всего одну запись?

Если numberposts=2 или 10, то без указания $limit=1 на странице отобразятся все 2 или 10 анонсов, что не есть хорошо, т.к. отображаться должен только один анонс. А уже по клику на кнопке "Следующая запись" должна появляться следующая запись.

2. саt=23 тоже нужно указывать, т.к. требуется получить статьи из конкретной категории,

а по клику на кнопке "Следующая запись" должна появляться следующая запись из этой же категории.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy