2017-02-08 5 views
0

Я новичок в WordPress, поэтому извиняюсь, если мой вопрос выглядит глупо.WordPress: Custom Post Type Постоянная ссылка забрала меня на домашнюю страницу

Я разработал следующую специальную форму, чтобы опубликовать конкретный тип сообщения story с переднего конца. Проблема, с которой я столкнулась, - это постоянная ссылка, которая автоматически генерируется. Когда я пытаюсь получить доступ к странице, он возвращает меня на домашнюю страницу. У меня есть настраиваемая страница single-story.php, созданная для моего типа сообщения, который, как я думал, будет доступен автоматически, но это не так.

<?php 
/* Post type: story */ 
add_shortcode('story', 'trip_story_form_builder_shortcode'); 

function trip_story_form_builder_shortcode(){ 
    if($_POST['story'] == 'submit' && !empty($_POST['action'])){ 
     //echo 'Ok'; 
    } 
    if(isset($_POST['txtTitle'])){ 
     $title = $_POST['txtTitle']; 
    } else { 
     //echo 'Please add a description'; 
    } ?> 
    <!-- form starts --> 
    <form method="post" name="story_form" action="" id="story_form"> 
     <div class="text-small"> 
      <div class="row margin-top-10"> 
       <div class="col-md-12"> 
        Story Title <i class="text-red">*</i> 
        <input type="text" class="form-control" id="txtTitle" name="txtTitle" maxlength="75" required /> 
       </div> 
      </div> 
      <div class="row margin-top-10"> 
       <div class="col-md-12"> 
        Story <i class="text-red">*</i> 
        <div class="margin-top-5"></div> 
        <?php 
         $content = ''; 
         $editor_id = 'txtStory'; 
         $settings = array(
          'textarea_name'=> 'txtStory', 
          'quicktags' => false, 
          'media_buttons' => true, 
          'teeny' => false, 
          'tinymce' => array(
           'toolbar1'=> 'bold,italic,underline,bullist,link,unlink,forecolor,undo,redo' 
          ) 
         ); 
         wp_editor($content, $editor_id, $settings); 
        ?> 
       </div> 
      </div> 
      <div class="row margin-top-10"> 
       <div class="col-md-8"> 
        Time of visit: 
        <div class="row margin-top-5"> 
         <div class="col-md-6"> 
          Year<i class="text-red">*</i> 
          <input type="text" class="form-control" id="txtYear" name="txtYear" maxlength="4" required /> 
         </div> 
         <div class="col-md-6"> 
          Month<i class="text-red">*</i> 
          <select id="cboMonth" name="cboMonth" class="form-control" required> 
           <option value="">-</option> 
           <option value="January">January</option> 
           <option value="February">February</option> 
           <option value="March">March</option> 
           <option value="April">April</option> 
           <option value="May">May</option> 
           <option value="June">June</option> 
           <option value="July">July</option> 
           <option value="August">August</option> 
           <option value="September">September</option> 
           <option value="October">October</option> 
           <option value="November">November</option> 
           <option value="December">December</option> 
          </select> 
         </div> 
        </div> 
       </div> 
       <div class="col-md-4"> 
        <div class="row margin-top-25"> 
         <div class="col-md-12"> 
          No. of heads <i class="text-red">*</i> 
          <input id="txtHeads" name="txtHeads" type="number" maxlength="3" class="form-control" required /> 
         </div> 
        </div> 
       </div> 
      </div> 
      <div class="row margin-top-10"> 
       <div class="col-md-12"> 
        Places visited <i class="text-red">*</i> 
        <input type="text" class="form-control" id="txtPlaces" name="txtPlaces" maxlength="300" required placeholder="Enter name of the places you visited. Separate places by comma(,)" /> 
       </div> 
      </div> 
      <div class="row margin-top-10"> 
       <div class="col-md-6"> 
        Category <i class="text-red">*</i> 
        <?php 
        $args = array(
         'show_option_all' => '', 
         'show_option_none' => '', 
         'option_none_value' => '', 
         'orderby'   => 'ID', 
         'order'    => 'ASC', 
         'show_count'   => 0, 
         'hide_empty'   => 1, 
         'child_of'   => 0, 
         'exclude'   => '', 
         'include'   => '', 
         'echo'    => 1, 
         'selected'   => 0, 
         'hierarchical'  => 0, 
         'name'    => 'cboCategory', 
         'id'     => 'cboCategory', 
         'class'    => 'form-control', 
         'depth'    => 0, 
         'tab_index'   => 0, 
         'taxonomy'   => 'category', 
         'hide_if_empty'  => true, 
         'value_field'  => 'term_id', 
        ); 
        wp_dropdown_categories($args); 
        ?> 
       </div> 
       <div class="col-md-6"> 
        Total Trip cost <i class="text-red">*</i> 
        <input type="number" id="txtCost" name="txtCost" required maxlength="6" class="form-control" /> 
       </div> 
      </div> 
      <div class="row margin-top-10"> 
       <div class="col-md-12"> 
        Additional information, if any (max. 600 characters) 
        <textarea id="txtInfo" name="txtInfo" rows="5" cols="80" maxlength="600" class="form-control" placeholder="For example, name of hotel you stayed, name and phone numebr of your cab driver etc."></textarea> 
       </div> 
      </div> 
      <div class="row margin-top-20"> 
       <div class="col-md-12"> 
        <input type="hidden" name="story" value="submit" /> 
        <input type="hidden" name="action" value="new_story" /> 
        <?php wp_nonce_field('new_story'); ?> 

        <input type="submit" value="Submit Trip Report" class="btn btn-primary text-medium-small"> 
       </div> 
      </div> 
     </div> 
    </form> 
<?php 
} 

function add_trip_story() { 
    if($_POST['story']=="submit" && !empty($_POST['action'])) { 
     $title  = $_POST['txtTitle']; 
     $description = $_POST['txtStory']; 

     //meta data builder 
     $visiting_year = $_POST['txtYear']; 
     $visiting_month = $_POST['cboMonth']; 
     $no_heads = $_POST['txtHeads']; 
     $places = $_POST['txtPlaces']; 
     $trip_cost = $_POST['txtCost']; 
     $addl_info = $_POST['txtInfo']; 

     $new_post = array(
      'post_title' => $title, 
      'post_content' => $description, 
      'post_type'  =>'story', 
      'post_status' => 'publish' 
     ); 

     //insert the the post into database by passing $new_post to wp_insert_post 
     $pid = wp_insert_post($new_post); 

     //We now use $pid (post id) to help add our post meta data 
     add_post_meta($pid, '_visting_year', $visiting_year, true); 
     add_post_meta($pid, '_visiting_month', $visiting_month, true); 
     add_post_meta($pid, '_visiting_heads', $no_heads, true); 
     add_post_meta($pid, '_visiting_places', $places, true); 
     add_post_meta($pid, '_visiting_cost', $trip_cost, true); 
     add_post_meta($pid, '_visting_addl_info', $addl_info, true); 
    } 
} 

add_action('init','add_trip_story'); 

Приведенная выше форма отображает и сохраняет данные в базе данных.

Я хочу загрузить один story в качестве local.tourplanner.com/story/title-of-the-story. Постоянная ссылка WordPress генерирует http://local.tourplanner.com/winter-vacation-at-auli-a-brief-report/, который всегда выводит меня на главную страницу.

Но как я могу сказать WordPress использовать определенный шаблон для моего story типа сообщения. Есть ли способ определить его в приведенном выше коде?

Могу я попросить еще пару вещей, пожалуйста?

  1. Как я могу видеть эти сообщения, созданные пользователями бу внутри wp-admin как я не регистрирует этот пост типа, используя register_post_type функцию?

  2. У меня есть категория выпадающих списков в форме. Как я могу сказать WordPress, чтобы использовать это как подзапись и загружать сообщения, связанные с этой категорией?

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

UPDATE
Я отказался от идеи хранения данных, как я делал далеко и создал custom post type путем регистрации его register_post_type функции.

Функция визуализации формы:

function render_user_story_form() { 

    $form='<form id="user_story_form" name="user_story_form" action="" method="post">'; 
    $form .= '<div><input type="text" class="form-control" id="_title" name="_title" maxlength="75" required placeholder="Story title" /></div>'; 
    $form .= '<div><textarea id="_description" name="_description" rows="5" cols="80" class="form-control" maxlength="500" required placeholder="Your story here"></textarea></div>'; 
    $form .= '<div><input type="text" class="form-control" id="_places_visited" name="_places_visited" maxlength="100" required placeholder="Places visited during the trip" /></div>'; 
    $form .= '<div><input type="number" class="form-control" id="_trip_cost" name="_trip_cost" maxlength="6" required placeholder="Trip cost" /></div>'; 
    $form .= '<input type="submit" value="Submit" class="btn btn-primary" />'; 
    $form .= '</form>'; 

    echo $form; 
} 

add_shortcode('new-user-story', 'render_user_story_form'); 

Ниже приведен фрагмент кода, что я написал для хранения данных в wp_posts и wp_postmeta таблиц, но ничего не выходит хранится.

function save_user_story() { 
    $title = $_POST['_title']; 
    $description = $_POST['_description']; 
    $places = $_POST['_places_visited']; 
    $cost = $_POST['_trip_cost']; 

    $post = array(
     'post_title' => $title, 
     'post_content' => $description, 
     'post_type' => 'user_story', 
     'post_status' => 'publish' 
    ); 

    $new_post_id = wp_insert_post($post, 10, 1); 

    add_post_meta($new_post_id, '_places_visited', $places); 
    add_post_meta($new_post_id, '_trip_cost', $cost); 
} 

add_action('save_post_user_story', 'save_user_story', 1, 2); 

Название моего сообщения типа user_story.
Ссылка: https://wordpress.stackexchange.com/questions/117269/saving-custom-post-in-custom-form/117331

ответ

0

Обычай Сообщение Тип данных не хранится, он добавляется во время выполнения из register_post_typeargs поставки.

Итак, поскольку вы используете его, WP, возможно, не может связывать данные с пользовательским типом сообщения, когда он находится в передней или задней части.

  1. Если вы не хотите использовать эту функцию, вы должны написать свой собственный WP_Query для подобной функции, как пост типа.
  2. Кроме того, для создания пользовательского бэкэнд-меню и выполнения этих запросов на них отображать данные с использованием класса WP_List_Table.
  3. И наконец, маршрутизация URL должна обрабатываться отдельно.

Итак, если вы опоздали regester_custom_post_type, вы сделали все, что делает каркас, кроме функции переднего конца и функции вставки БД.

Надеюсь, я уточнил ваши 3 вопроса по URL-адресам, категориям и URL-адресам.

+0

Если вы считаете иначе, то дайте мне знать. Я хотел бы учиться. –

+0

Что касается хранения и получения данных, то форма работает нормально. Я уже использую 'WP_Query' для извлечения данных для' post_type => 'story'' на моей странице списка. Но я не знаю, как использовать пользовательский шаблон перезаписи без использования функции. На самом деле я попытался создать форму с помощью 'meta_box' и зарегистрировав тип сообщения, но я не мог понять, насколько я еще новичок в WP. Если вы, пожалуйста, присылайте мне ссылку на учебник, которая очень поможет мне. –

+0

Как я могу принести ту же пользовательскую форму ввода типа сообщения, которая была создана с помощью 'register_custom_post_type', в интерфейс? Будет ли «короткий код» делать это? Если да, когда я сохраняю данные, я должен использовать 'wp_insert_post', и это автоматически помещает метаданные в таблицу' wp_postmeta'? Я обдумал это, но не смог найти правильного ответа на него. Не могли бы вы немного объяснить это? –

0

1) Самый простой способ установить пользовательские пермалинки пост-типа с плагином того же имени: https://wordpress.org/plugins/custom-post-type-permalinks/

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

2) Вы должны зарегистрировать свой пост-тип с помощью register_post_type в пользовательском плагине или functions.php. Это, по крайней мере, создает таблицу в БД, которую вы вводите на входной форме.

3) Вам нужно будет отобразить категорию выпадающего списка, используемую в форме front-end, в поле БД, которое является частью вашего настраиваемого типа сообщений. Для настраиваемых полей мне нравится плагин Advanced Custom Fields. Он будет поддерживать эту структуру и правильно записывать в базу данных, очень прост в использовании на уровне шаблона.

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

+0

Спасибо за ваши предложения. Я тем временем отказался от идеи сохранить данные пользовательских сообщений типа, как я это делал. Скорее, теперь я создал настраиваемый тип сообщений, используя функцию register_post_type, которая появляется в admin. Кстати, я уже использую ACF в своих двух других CPT. Поскольку я изучаю WP, я хотел создать один из своих. В моем новом CPT я создал три CM-блока и мог показать форму на первой странице с помощью «короткого кода». Но здесь я потерян. Прошли некоторые статьи, но не смогли сохранить данные в таблицах 'wp_posts' и' wp_postmeta'. В следующем комментарии добавлена ​​дополнительная информация. –

+0

Я написал функцию 'render_user_story_form', которая выводит форму. Затем записывается другая функция save_user_story, которая должна сохранять данные. Добавлены 'add_action ('save_post_user_story', 'save_user_story', 1, 2);' для хранения данных. Должно быть, я сделал что-то неправильно. Я обновил свой вопрос с помощью функции 'save_user_story'. Пожалуйста, порекомендуйте. –

 Смежные вопросы

  • Нет связанных вопросов^_^