Правильно ли так оформлять функции темы WP?

Ссылка скопирована
1 ответ

Вопрос к знатокам WP
Сейчас натягиваю тему и увидел такой подход
в functions.php
Подключаю php файл, например такой

require get_template_directory() . '/core/modules/post-upgrade.php';

require get_template_directory() . '/core/modules/post-upgrade.php';

дабы разбить всё по полочкам а не городить все в functions

Далее в post-upgrade.php

<?php  if (!defined('WPINC')) {     die; }  class PostArticle {      public static function load_module()     {         add_action('Post__theme-article-grid_label_partner', [__CLASS__, 'single_label_partner_grid'], 100);     }      public static function single_label_partner_grid($post_id)     {         $post_type = get_post_type($post_id);          $field_db = get_post_meta($post_id, '_advert_post_front', true);          if ($field_db == 'on') : ?>              <div class="button button_partner button_size_small button_theme_default <?php echo ('advert_post' == $post_type) ? 'special-project-color' : ''; ?>">                 <svg class="icon button__partner-icon">                     <use xlink:href="<?php bloginfo('template_url'); ?>/assets/img/icons/sprite.svg#i-money"></use>                 </svg>                 <?php if ('advert_post' == $post_type) : ?>                     <span>Спецпроект</span>                 <?php else : ?>                     <span>Партнерский материал</span>                 <?php endif; ?>             </div> <?php         endif;     } }  PostArticle::load_module();

<?php if (!defined('WPINC')) { die; } class PostArticle { public static function load_module() { add_action('Post__theme-article-grid_label_partner', [__CLASS__, 'single_label_partner_grid'], 100); } public static function single_label_partner_grid($post_id) { $post_type = get_post_type($post_id); $field_db = get_post_meta($post_id, '_advert_post_front', true); if ($field_db == 'on') : ?> <div class="button button_partner button_size_small button_theme_default <?php echo ('advert_post' == $post_type) ? 'special-project-color' : ''; ?>"> <svg class="icon button__partner-icon"> <use xlink:href="<?php bloginfo('template_url'); ?>/assets/img/icons/sprite.svg#i-money"></use> </svg> <?php if ('advert_post' == $post_type) : ?> <span>Спецпроект</span> <?php else : ?> <span>Партнерский материал</span> <?php endif; ?> </div> <?php endif; } } PostArticle::load_module();

Вот вопрос к этому файлу, насколько это не колхоз? правильно ли с точки зрения WP так организовывать функции.

Ну и в самой теме вывожу через хук

<?php do_action('Post__theme-article-grid_label_partner', get_the_ID()); ?>

<?php do_action('Post__theme-article-grid_label_partner', get_the_ID()); ?>

Хочу разбить на несколько таких файлов, чтоб где то лежали фукнции для главной, где то для single и т.д.

Дополнительно:

Как вообще можно что-то делать не зная даже что как называется (терминологию)?
Начинай делать правильно, а не натягивать презервативы куда не следует.

  • Refguser, Так а в чём подход не правильный? Можно это писать всё в functions.php а так разбить это разве плохо?
  • Ответы:

    Есть вариант, приближенный к нормальным подходам

    условно в вашем index.php

    do_action("my_content");

    Пример контента для author.page (надеюсь вы понимаете, что этот код не вставляется в author.php)

    class AuthorPage {   public function __construct()   {   	add_action('content', [$this, 'template']);   }      public function data(): array   {   	global $wp_query; 	$user = $wp_query->get_queried_object(); 	 	if (!($user instanceof WP_User)) { 		return []; 	} 	   	return [   	    'title' => $user->first_name,   	];   }      public function template(): void   {   	if (!is_author()) { 		return; 	}      	get_template_part("template-parts/author", null, [...$this->data()]);   } }

    class AuthorPage { public function __construct() { add_action('content', [$this, 'template']); } public function data(): array { global $wp_query; $user = $wp_query->get_queried_object(); if (!($user instanceof WP_User)) { return []; } return [ 'title' => $user->first_name, ]; } public function template(): void { if (!is_author()) { return; } get_template_part("template-parts/author", null, [...$this->data()]); } }

    сам template-parts/author.php:

    <?php echo esc_html($args['title'] ?? ''); ?>

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

    Правильно ли так оформлять функции темы WP?

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Backend-редакция Ответ

    Разбивать functions.php на отдельные файлы — нормальный подход. Но в показанном варианте есть несколько моментов, которые лучше поправить: смешивание логики и HTML, нестандартные названия хуков, статический класс без явной инициализации и прямой вывод разметки внутри метода.

    Само подключение файла:

    require get_template_directory() . '/core/modules/post-upgrade.php';

    require get_template_directory() . '/core/modules/post-upgrade.php';

    нормальное, если файл существует и подключается один раз. Лучше использовать require_once, чтобы не получить повторное объявление класса.

    Класс с load_module() тоже допустим, но нужно явно вызвать его после подключения:

    require_once get_template_directory() . '/core/modules/post-upgrade.php';
    PostArticle::load_module();

    require_once get_template_directory() . '/core/modules/post-upgrade.php'; PostArticle::load_module();

    Проверку if (!defined('WPINC')) die; можно оставить, хотя чаще используют ABSPATH:

    defined('ABSPATH') || exit;

    defined('ABSPATH') || exit;

    Что я бы улучшил: метод не должен напрямую содержать много HTML. Либо верните строку, либо подключайте template part. Например:

    public static function single_label_partner_grid($post_id) {
        if (get_post_meta($post_id, '_advert_post_front', true) !== 'on') {
            return;
        }
     
        get_template_part('template-parts/labels/partner', null, [
            'post_id' =&gt; $post_id,
        ]);
    }

    public static function single_label_partner_grid($post_id) { if (get_post_meta($post_id, '_advert_post_front', true) !== 'on') { return; } get_template_part('template-parts/labels/partner', null, [ 'post_id' =&gt; $post_id, ]); }

    Так код модуля отвечает за условие, а разметка лежит в шаблоне. Это проще поддерживать.

    Итог: направление правильное — не держать всё в functions.php. Но следите, чтобы модули были подключены один раз, хуки назывались понятно, HTML не разрастался внутри классов, а бизнес-логика была отделена от шаблонов.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно