Поддержка Проблемы и решения Отображение своих полей из БД в админке

  • Здравствуйте. Подскажите пожалуйста, я добавил несколько дополнительных полей в таблицу wp_posts, как сделать чтобы их можно было заполнять при создании нового поста из админ панели. Спасибо.

Просмотр 14 ответов — с 1 по 14 (всего 14)
  • Модератор Юрий

    (@yube)

    Юрий, я правильно понял, мне нужно добавить весь этот код в template.php ? можете пожалуйста детальней указать где мне нужно указать название моего поля из БД? (допустим post_country)
    Спасибо.

    /**
     * Adds a box to the main column on the Post and Page edit screens.
     */
    function myplugin_add_custom_box() {
    
        $screens = array( 'post', 'page' );
    
        foreach ( $screens as $screen ) {
    
            add_meta_box(
                'myplugin_sectionid',
                __( 'post_country', 'myplugin_textdomain' ),
                'myplugin_inner_custom_box',
                $screen
            );
        }
    }
    add_action( 'add_meta_boxes', 'myplugin_add_custom_box' );
    
    /**
     * Prints the box content.
     *
     * @param WP_Post $post The object for the current post/page.
     */
    function myplugin_inner_custom_box( $post ) {
    
      // Add an nonce field so we can check for it later.
      wp_nonce_field( 'myplugin_inner_custom_box', 'myplugin_inner_custom_box_nonce' );
    
      /*
       * Use get_post_meta() to retrieve an existing value
       * from the database and use the value for the form.
       */
      $value = get_post_meta( $post->ID, '_my_meta_value_key', true );
    
      echo '<label for="myplugin_new_field">';
           _e( "Description for this field", 'myplugin_textdomain' );
      echo '</label> ';
      echo '<input type="text" id="myplugin_new_field" name="myplugin_new_field" value="' . esc_attr( $value ) . '" size="25" />';
    
    }
    
    /**
     * When the post is saved, saves our custom data.
     *
     * @param int $post_id The ID of the post being saved.
     */
    function myplugin_save_postdata( $post_id ) {
    
      /*
       * We need to verify this came from the our screen and with proper authorization,
       * because save_post can be triggered at other times.
       */
    
      // Check if our nonce is set.
      if ( ! isset( $_POST['myplugin_inner_custom_box_nonce'] ) )
        return $post_id;
    
      $nonce = $_POST['myplugin_inner_custom_box_nonce'];
    
      // Verify that the nonce is valid.
      if ( ! wp_verify_nonce( $nonce, 'myplugin_inner_custom_box' ) )
          return $post_id;
    
      // If this is an autosave, our form has not been submitted, so we don't want to do anything.
      if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
          return $post_id;
    
      // Check the user's permissions.
      if ( 'page' == $_POST['post_type'] ) {
    
        if ( ! current_user_can( 'edit_page', $post_id ) )
            return $post_id;
    
      } else {
    
        if ( ! current_user_can( 'edit_post', $post_id ) )
            return $post_id;
      }
    
      /* OK, its safe for us to save the data now. */
    
      // Sanitize user input.
      $mydata = sanitize_text_field( $_POST['myplugin_new_field'] );
    
      // Update the meta field in the database.
      update_post_meta( $post_id, '_my_meta_value_key', $mydata );
    }
    add_action( 'save_post', 'myplugin_save_postdata' );
    
    // This function adds a meta box with a callback function of my_metabox_callback()
    function add_my_meta_box() {
         $var1 = 'this';
         $var2 = 'that';
         add_meta_box(
               'metabox_id',
               'Metabox Title',
               'my_metabox_callback',
               'page',
               'normal',
               'low',
               array( 'foo' => $var1, 'bar' => $var2)
          );
    }
    
    // $post is an object containing the current post (as a $post object)
    // $metabox is an array with metabox id, title, callback, and args elements.
    // The args element is an array containing your passed $callback_args variables.
    
    function my_metabox_callback ( $post, $metabox ) {
         echo 'Last Modified: ' . $post->post_modified;        // outputs last time the post was modified
         echo $metabox['args']['foo'];                         // outputs 'this'
         echo $metabox['args']['bar'];                         // outputs 'that'
         echo get_post_meta( $post->ID, 'my_custom_field', true ); // outputs value of custom field
    }
    Модератор Юрий

    (@yube)

    в template.php ?

    В какой еще template.php?

    где мне нужно указать название моего поля из БД?

    В функции, висящей на хуке ‘save_post’ использовать $wpdb->query для изменения значения поля у записи.

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

    template php, который лежит в \wp-admin\includes. я добавил туда приведенный выше код, и теперь при добавлении поста, там отображается еще одно текстовое поле, а вот как его связать с самой бд, не могу понять.

    Я пробовал использовать произвольные поля, но проблема в том что они не сохраняются в БД. а мне это нужно. Может можно как — то их сохранить в базу данных?

    Модератор Юрий

    (@yube)

    template php, который лежит в \wp-admin\includes. я добавил туда приведенный выше код,

    Ни в коем случае не уродуйте файлы движка! У вордпресса для расширения функционала есть API.

    Я пробовал использовать произвольные поля, но проблема в том что они не сохраняются в БД. а мне это нужно

    А где ж они по-вашему хранятся, если не в БД?

    Может можно как — то их сохранить в базу данных?

    Повторю:
    В функции, висящей на хуке ‘save_post’ использовать $wpdb->query для изменения значения поля у записи.

    К сожалению, Ваших знаний вордпресс недостаточно для выбранного Вами способа реализации задачи. Рекомендую вернуть вордпрессу первоначальный вид (файлы и структуру таблицы) и пользоваться штатными доп.полями и плагинами. За сим откланиваюсь.

    я добавил несколько дополнительных полей в таблицу wp_posts,

    Кто Вас научил плохому?!!

    Произвольные поля (+ возможно, плагины для более удобного управления) — то, что Вам нужно.

    Юрий, хорошо, пойду простым путем, полностью с Вами согласен, я тут практически ничего не знаю. На место уже все вернул)

    А где ж они по-вашему хранятся, если не в БД?

    А как их достать из бд? в phpMyAdmin они не отображаются, пробовал выбрать их sql запросом тоже ничего не дало.

    Кто Вас научил плохому?!!

    Никто, сам импровизирую, пока не сильно удачно)

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

    Никто, сам импровизирую, пока не сильно удачно)

    Читайте документацию и будет Вам счастье 🙂

    ЗЫ. Позвольте дам совет: никогда не трогайте БД и файлы движка (во всяком случае пока не будете уверенно понимать как работает движок. Вне зависимости от его названия)

    но пока что еще не сообразил каким образом они там хранятся.

    Для реализации Ваших хотелок Вам не нужно знать как хранятся. Вам нужно узнать как ими управлять (заполнять и получать данные). Об этом и написано по данной выше ссылке.
    Можете ещё вот это почитать.

    Модератор Юрий

    (@yube)

    А как их достать из бд?

    Как-то так

    SELECT wp_posts.*, wp_postmeta.meta_value as post_country
    FROM wp_posts
    LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
    WHERE wp_postmeta.meta_key='country'

    Модератор Юрий

    (@yube)

    не нужно знать как хранятся.

    Знать всегда полезно. Хотя бы для того, чтобы не хотеть невозможного 😉

    Модератор Юрий

    (@yube)

    Wild_klas, а давайте сделаем так: Вы расскажете, что в результате хотите получить, а мы попробуем подсказать наиболее рациональный путь. Может, Вам нужны вовсе не поля, а еще одна таксономия. А может и она не нужна.

    Как-то так
    SELECT wp_posts.*, wp_postmeta.meta_value as post_country
    FROM wp_posts
    LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
    WHERE wp_postmeta.meta_key=’country’

    Юрий, спасибо, теперь думаю разберусь.

    SeVlad, мне даже интересно узнать это устроено. Да и когда я это понимаю мне проще работать)

    у меня такая задача, нужно сделать фильтр по нескольким направлениям: страна, стоимость и тд. Для этого я хотел добавить несколько полей в саму таблицу wp_post, и потом уже написать php файл который это все бы обрабатывал. Теперь, когда вы меня поставили на истинный путь, я сделаю все так же только не буду трогать wp_post, а воспользуюсь дополнительными полями.
    Спасибо большое.)

    Знать всегда полезно.

    Это да, но в данном случае «не нужно» употреблено в смысле — «не является необходимостью» для решения конечной задачи. 😉

    Да и когда я это понимаю мне проще работать)

    Полностью поддерживаю. Однако для того что бы ездить на авто по городу — знать правила дорожного движения обязательно, а вот работу ДВС, термех и электродело вовсе нет 😉

    Поэтому ИМХО — если надо добиться относительно быстрых результатов надо вначале изучить то, что нужно (наличие базовых знаний — обязательно).
    А уж коль хочется более глубокого погружения — тогда конечно.. можно начать и принципов работы транзистора 🙂 Правда, при этом, можно так и не дойти до сегодняшней цели. 🙂

Просмотр 14 ответов — с 1 по 14 (всего 14)
  • Тема «Отображение своих полей из БД в админке» закрыта для новых ответов.