Приложение блога Codeigniter: замените идентификатор сообщения на slug только в URL-адресе одного сообщения - PullRequest
0 голосов
/ 14 октября 2018

Я работаю над базовым приложением блога в Codeigniter 3.1.8 и Bootstrap 4.

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

В целях SEO я хотел бы использовать дружественные URL-адреса вместо идентификаторов для отображения отдельных сообщений , поэтому у меня естьдобавлен столбец slug в таблицу posts.

enter image description here

Слагы сделаны из заголовков сообщений, с этими кусками кода в *Модель 1018 * Posts_model и контроллер Posts соответственно.

От модель :

public function slug_count($slug){
    $this->db->select('count(*) as slugcount');
    $this->db->from('posts');
    $this->db->where('slug', $slug);
    $query = $this->db->get();
    return $query->row(0)->slugcount;
}

public function create_post($post_image, $slug) {
    $data = [
        'title' => $this->input->post('title'),
        'slug' => $slug,
        'description' => $this->input->post('desc'),
        'content' => $this->input->post('body'),
        'post_image' => $post_image,
        'author_id' => $this->session->userdata('user_id'),
        'cat_id' => $this->input->post('category'),
        'created_at' => date('Y-m-d H:i:s')
    ];
    return $this->db->insert('posts', $data);
} 

От контроллер :

// Create slug (from title)
$slug = url_title($this->input->post('title'), 'dash', TRUE);
$slugcount = $this->Posts_model->slug_count($slug);
if ($slugcount > 0) {
    $slug = $slug."-".$slugcount;
}

Чтобы достичь своей цели SEO, я рассмотрел и опробовал подход в этого урока , но поскольку существует множество функциональных возможностей, требующихидентификаторы (например, удаление сообщений через AJAX) и другие, для которых не требуется слагов (редактирование сообщений). Я не могу (и не желаю) существенно изменить метод просмотра сообщений в контроллере,

public function post($id) {
    $data = $this->Static_model->get_static_data();
    $data['pages'] = $this->Pages_model->get_pages();
    $data['categories'] = $this->Categories_model->get_categories();
    $data['posts'] = $this->Posts_model->sidebar_posts($limit=5, $offset=5);
    $data['post'] = $this->Posts_model->get_post($id);

    if ($data['categories']) {
        foreach ($data['categories'] as &$category) {
            $category->posts_count = $this->Posts_model->count_posts_in_category($category->id);
        }
    }

    if (!empty($data['post'])) {
        // Overwrite the default tagline with the post title
        $data['tagline'] = $data['post']->title;

        // Get post comments
        $post_id = $data['post']->id;
        $data['comments'] = $this->Comments_model->get_comments($post_id);

        $this->load->view('partials/header', $data);
        $this->load->view('post');
    } else {
        $data['tagline'] = "Page not found";
        $this->load->view('partials/header', $data);
        $this->load->view('404');
    }
    $this->load->view('partials/footer');
} 

и соответствующий код в модели:

public function get_post($id) {
    $query = $this->db->get_where('posts', array('id' => $id));
    if ($query->num_rows() > 0) {
        $data = $query->row();
        // run separate query for author name
        $author_query = $this->db->get_where('authors', array('id' => $data->author_id));
        if ($author_query->num_rows() == 1) {
            $author = $author_query->row();
            $data->first_name = $author->first_name;
            $data->last_name = $author->last_name;             
        } else {
            $data->first_name = 'Unknown';
            $data->last_name = '';
        }
        return $data;
    }
}

Что было бы прощеe, менее "навязчивый" подход к замене идентификатора записи на slug в отдельном сообщении просмотр только ?

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Обновление в модели

заменить

public function get_post($id) {
   $query = $this->db->get_where('posts', array('id' => $id));

на

public function get_post($slug) {
    $query = $this->db->get_where('posts', array('slug' => $slug)); 

Обновление в контроллере

заменить

public function post($id) {

на

public function post($slug) {

и заменить

$data['post'] = $this->Posts_model->get_post($id);

на

$data['post'] = $this->Posts_model->get_post($slug);
0 голосов
/ 15 октября 2018

Также обновите ваши маршруты для более удобного для пользователя URL.

//If you categorize your blog
$route['blog-category/(:any)'] = 'blogController/blogFunction/$1';
//this will accept any uri
$route['(:any)/(:any)'] = 'blogController/blogFunction'
0 голосов
/ 14 октября 2018

Ну, я думаю, вы можете использовать и идентификатор, и слаг в одной и той же функции / URL, например, /id/slug.Таким образом, у вас всегда есть id, и SEO тоже счастлив, потому что в URL есть заголовок страницы (slug).Тогда на вашей функции, вы можете иметь public function post($id,$slug="") {.

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