Изменение содержимого публикации с помощью кнопки действий the_post

Я пытаюсь понять, как лучше изменить способ отображения результатов поиска с помощью моего пользовательского типа записи. У меня есть функция поиска, которая работает правильно и дает правильные результаты, и теперь я работаю над изменением содержимого каждого сообщения, которое отображается на странице результатов поиска. Более конкретно, я хочу отображать пользовательскую мета-информацию из каждого сообщения.

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

function rtu_pre_get_posts( $query ) {    if ( is_admin() || ! $query->is_main_query() ){        return;    }    if ( !is_post_type_archive( 'classifieds' ) ){        return;    }    $meta_query = array();    if( count( $meta_query ) > 1 ){        $meta_query['relation'] = 'AND';    }    if( count( $meta_query ) > 0 ){        $query->set( 'meta_query', $meta_query );    }}add_action( 'pre_get_posts', 'rtu_pre_get_posts', 1 );function rtu_search_form( $args ){    //The Query    //meta_query expects nested arrays, even if you only have one query    //to add the category param    $rtu_query = new WP_Query( array( 'post_type' => 'classifieds', 'posts_per_page' => '-1' ) );    //The Loop    if ( $rtu_query->have_posts() ) {        while ( $rtu_query->have_posts() ) {            $rtu_query->the_post();        }    }    /* Restore original Post Data */   wp_reset_postdata();    //Set up the type radio buttons    $args = array( 'hide_empty' => false );    $type_terms = get_terms( 'type', $args );    if( is_array( $type_terms ) ){        $select_type .= '<input type="radio" name="producttype" value="" selected="selected">' . __( 'All', 'classifieds_plugin' ) . '</br>';        foreach ( $type_terms as $term ) {            $select_type .= '<input type="radio" name="producttype" value="' . $term->slug . '">' . $term->name . '</br>';        }    }    //Set up the location dropdown list    $args = array( 'hide_empty' => false );    $location_terms = get_terms( 'location', $args );    if( is_array( $location_terms ) ){        $select_location = '<select name="location">';        $select_location .= '<option value="" selected="selected">' . __( 'Select location', 'classifieds_plugin' ) . '</option>';        foreach ( $location_terms as $term ) {            $select_location .= '<option value="' . $term->slug . '">' . $term->name . '</option>';        }        $select_location .= '</select>' . "
";    }    //Set up the brand dropdown list    $args = array( 'hide_empty' => false );    $brand_terms = get_terms( 'brand', $args );    if( is_array( $brand_terms ) ){        $select_brand = '<select name="brand">';        $select_brand .= '<option value="" selected="selected">' . __( 'Select brand', 'classifieds_plugin' ) . '</option>';        foreach ( $brand_terms as $term ) {            $select_brand .= '<option value="' . $term->slug . '">' . $term->name . '</option>';        }        $select_brand .= '</select>' . "
";    }    //Set up the class dropdown list    $args = array( 'hide_empty' => false );    $class_terms = get_terms( 'class', $args );    if( is_array( $class_terms ) ){        $select_class = '<select name="class">';        $select_class .= '<option value="" selected="selected">' . __( 'Select class', 'classifieds_plugin' ) . '</option>';        foreach ( $class_terms as $term ) {            $select_class .= '<option value="' . $term->slug . '">' . $term->name . '</option>';        }        $select_class .= '</select>' . "
";    }    //Set up the power dropdown list    $args = array( 'hide_empty' => false );    $power_terms = get_terms( 'power', $args );    if( is_array( $power_terms ) ){        $select_power = '<select name="power">';        $select_power .= '<option value="" selected="selected">' . __( 'Select power', 'classifieds_plugin' ) . '</option>';        foreach ( $power_terms as $term ) {            $select_power .= '<option value="' . $term->slug . '">' . $term->name . '</option>';        }        $select_power .= '</select>' . "
";    }    $output = '<form id="rtuform" action="' . esc_url( home_url() ) . '" method="GET" role="search">';    $output .= '<div class="rtutextfield">' . '<input type="text" name="s" placeholder="Search by keyword..." value="' . get_search_query() . '" /></div>';    $output .= '<div class="rtuselectbox">' . $select_type . '</div>';    $output .= '<div class="rtuselectbox">' . $select_location . '</div>';    $output .= '<div class="rtuselectbox">' . $select_brand . '</div>';    $output .= '<div class="rtuselectbox">' . $select_class . '</div>';    $output .= '<div class="rtuselectbox">' . $select_power . '</div>';    $output .= '<input type="hidden" name="post_type" value="classifieds" />';    $output .= '<p><input type="submit" value="Search" class="button" /></p></form>';    return $output;}

Я включил все это здесь на случай, если какая-то другая часть важна, но я считаю, что это та часть, с которой мне нужно связываться:

//The Loopif ( $rtu_query->have_posts() ) {    while ( $rtu_query->have_posts() ) {        $rtu_query->the_post();    }}

Однако я не уверен, как это сделать, потому что, когда я пытаюсь что-то добавить к нему, вот так:

//The Loopif ( $rtu_query->have_posts() ) {    while ( $rtu_query->have_posts() ) {        $rtu_query->the_post();       ?>       <p>Some extra content...</p>       <?php    }}

Бит, который я добавил, отображается на боковой панели чуть выше настраиваемое поле поиска, а не с каждым постом. Весь этот фрагмент кода - это то, что я только что взял из статьи в Интернете и сделал так, чтобы соответствовать моим потребностям, поэтому я немного оторвался от своего элемента и пытаюсь выяснить все как можно лучше.

ОБНОВЛЕНИЕ:

Вот что находится в моем файле search -lasss.php в моей дочерней теме. (это дочерняя тема, построенная на основе Genesis.)

<?php/** * Custom search template *///Force full-width-content layout settingadd_filter( 'genesis_pre_get_option_site_layout', '__genesis_return_sidebar_content' );//remove the default genesis sidebarremove_action( 'genesis_sidebar', 'genesis_do_sidebar' );//Display custom search sectionadd_action( 'genesis_sidebar', 'display_search' );function display_search() {    echo rtu_search_form($args);}get_search_query();genesis();

Я создал этот пользовательский шаблон поиска специально для этого пользовательского типа записи. В моем файле дочерних тем functions.php я использую следующую функцию, чтобы заставить тему использовать этот пользовательский шаблон поиска для моего пользовательского типа записи:

function template_chooser($template)   {      global $wp_query;     $post_type = get_query_var('post_type');     if( $wp_query->is_search && $post_type == 'classifieds' )     {  return locate_template('search-classifieds.php');  // redirect to archive-search.php  }     return $template;   }add_filter('template_include', 'template_chooser');

Я получил этот плагин из статьи в Smashing Magazine. Вы можете просмотреть исходный плагин здесь:

https://gist.github.com /carlodaniele /fd5847f4baf42ca84771273ce21771fd

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

Ответы и комментарии:

Почему вы не делаете это непосредственно в шаблоне search.php и вместо этого полагаетесь на действия и фильтры?
Создан 12-12-2018 06:38 kero

Существуют фильтры для содержимого и выдержки, вам не нужно использовать the_post, и вы не должны помещать хуки и фильтры в сам шаблон.
Создан 12-12-2018 06:10 Tom J Nowell♦

@kero Разве это не то, что я делаю? Как я уже говорил в посте, код, который я включил, находится в моем шаблоне search.php. search.php - единственное место, где я делаю изменения для этого. Если есть что-то еще, что я должен делать, пожалуйста, дайте мне знать.
Создан 12-12-2018 06:11 JLW

@JLW вы говорите, что ваш цикл не в шаблоне темы? Шаблоны для темы, вы абсолютно уверены, что ваша тема не содержит search.php? Насколько я понимаю, цикл, который вы пытаетесь изменить, ничего не делает, но даже если он это сделал, он находится в плагине, это не то место, которое вы должны модифицировать. Опять же, шаблон поиска находится в теме. Если его нет, то вам нужно посмотреть иерархию шаблонов тем, чтобы выяснить, какой резерв используется
Создан 14-12-2018 02:40 Tom J Nowell♦

Но что более важно, какой плагин, на который вы ссылаетесь, добавляет этот поисковый код? Это сторонний плагин? Или что-то, что вы создали сами? Это начинает звучать как один из тех сценариев, когда выбранный вами плагин не очень хорошо построен, и правильное решение - либо обратиться в службу поддержки dev, либо использовать другой плагин (поддержка сторонних разработчиков dev-плагина здесь оффтопна). Откуда этот код?
Создан 14-12-2018 02:17 Tom J Nowell♦

Как бы я сделал это в search.php? Я искал несколько дней и не могу найти ничего, что подсказывало бы мне правильный путь для достижения того, что мне нужно. Первоначально я пытался изменить поисковый запрос, но не мог найти правильный способ сделать это, ничего, что я пытался сработать. Затем я наткнулся на что-то, что предположил, что the_post - лучший способ сделать это, но, очевидно, это было неправильно. Не могли бы вы указать мне правильное направление?
Создан 12-12-2018 06:42 JLW

Вы не будете использовать фильтры, это немного более буквально, чем вы думаете, например. если вы не хотите отображать заголовок, выберите бит с помощью the_title (), нажмите клавишу удаления на клавиатуре и сохраните. Я полагаю, что отчасти это связано с тем, что вы пришли к решению проблемы с решением, но никогда не говорили, что решало сломанное решение и какова была ваша первоначальная задача. Ирония в том, что код, который вы ищете, уже есть в вашем первоначальном вопросе, но по какой-то причине вы запускаете его на фильтре the_post, а не просто запускаете его непосредственно в search.php
Создан 12-12-2018 06:29 Tom J Nowell♦

Большое спасибо, что нашли время, чтобы объяснить это. Проблема в том, что исходный файл search.php, который я использую, имел только следующее: get_search_query (); который я не знаю, как изменить, и я не смог найти никакой информации об этом. Каждый найденный пример во многом напоминал ваш пример с различными частями, что, конечно, не помогло мне, потому что это было не то, что я видел в своем собственном файле. Я не знаю достаточно об этом, чтобы знать, что делать с тем, что у меня было, но я, конечно, пытаюсь учиться. Я думал, что наконец нашел решение, но ясно, что это было неправильно.
Создан 12-12-2018 07:25 JLW

если это правда, то все, что будет отображаться, будет поисковым запросом и ничего больше, вы уверены, что это все, что есть? Или что это не включает другие шаблоны?
Создан 12-12-2018 07:19 Tom J Nowell♦

Вы абсолютно правы, я не могу поверить, что меня никогда не осенило! Я думаю, что нашел ту часть, которая действительно имеет отношение к моей проблеме. Я отредактировал свой оригинальный вопрос, включив в него, как мне кажется, гораздо более полезную информацию. Я все еще совершенно потерян и чувствую себя очень невежественным, но я очень ценю вашу помощь!
Создан 13-12-2018 10:21 JLW

Не используйте the_post, вместо этого используйте фильтр the_content для изменения содержимого, передаваемого в вызов the_content ().
Тем не менее, это ваша тема, поэтому лучший способ сделать это - просто сделать это в search.php, а не заморачиваться с фильтрами и действиями. AKA не запускает код на фильтре, чтобы попытаться изменить или перехватить то, что делает шаблон, просто сделайте это прямо в шаблоне.
Например. если это мой search.php:
<? PHP

while (have_posts ()) {
    the_post ();
    the_title ();
    содержимое();
}

И я хочу заменить содержимое Lorem ipsum, я могу сделать это:
<? PHP

while (have_posts ()) {
    the_post ();
    the_title ();
    ?>
    

Лорем Ипсум Долоры сидят рядом и т. д. p>
    <? PHP
}

Или, если бы я хотел добавить объявление PNG для пони после каждого заголовка в результатах поиска:
<? PHP

while (have_posts ()) {
    the_post ();
    the_title ();
    toms_pony_advert ();
    содержимое();
}

Где функция toms_pony_advert () выводит упомянутое объявление.
Я подозреваю, что вы зациклены на существующем волшебном способе WordPress изменить шаблон темы без фактического изменения шаблона темы, но правильный способ - просто изменить файл напрямую. Ведь это твой код. Это не использовать какой-то фильтр или действие, или API. Причина, по которой вы не можете найти это с помощью поиска, заключается в том, что это не знание WordPress, а фундаментальные знания в области программирования, в частности, основы PHP.
Если это не ваш код, тогда создайте дочернюю тему и делайте так. Если это WP Core, нет, никогда не делайте этого, используйте действия и фильтры. Если кто-то использует плагин, использует действия и фильтры, а если их нет, то вам нужно будет запросить их добавление или разветвить плагин.
Если вы пытаетесь сделать это с помощью плагина, и таким образом, чтобы он работал, он работал для всех тем, с другой стороны, это была бы совершенно другая проблема, и у нее нет правильного решения. Но вы не в такой ситуации.

Создан 12-12-2018 06:25