Доработка админки - показывать произвоьные поля только на нужных страницах

12
Sly32
На сайте с 29.03.2012
Offline
302
801

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


add_action('admin_init', 'ym_page_fields', 1);

function ym_page_fields() {
add_meta_box('ym_fields', 'Дополнительные поля Яндекс-карта', 'ym_fields_page_box_func', 'page', 'normal', 'high');
}
function ym_fields_page_box_func( $post ){?>
<?php
$parent_page_id = get_page_by_title(get_option('ym_cat'))->ID;
if ($post->post_parent) {
$ancestors=get_post_ancestors($post->ID);
$root=count($ancestors)-1;
$parent = $ancestors[$root];
} else {
$parent = $post->ID;
}
if ($parent == $parent_page_id) {
?>
<h4>Данные для Яндекс карты</h4>
***здесь сама форма вывода доп полей
}

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

Пытался инициализировать так -



function ym_page_fields($post) {
$parent_page_id = get_page_by_title(get_option('ym_cat'))->ID;
if ($post->post_parent) {
$ancestors=get_post_ancestors($post->ID);
$root=count($ancestors)-1;
$parent = $ancestors[$root];
} else {
$parent = $post->ID;
}
if ($parent == $parent_page_id) {
add_meta_box('ym_fields', 'Дополнительные поля Яндекс-карта', 'ym_fields_page_box_func', 'page', 'normal', 'high');
}
}

...

Дает ошибку - не видит $post! соответсвенно не может определить id страницы Почему, не понимаю, вроде вызов идет практически так же.

Подскажите, что не так?

Да, ACF не предлагать!!!

Playerror
На сайте с 28.09.2008
Offline
117
#1
Sly32:

Дает ошибку - не видит $post! соответсвенно не может определить id страницы Почему, не понимаю, вроде вызов идет практически так же.
Подскажите, что не так?

Да, ACF не предлагать!!!

global $post ?

Sly32
На сайте с 29.03.2012
Offline
302
#2
Playerror:
global $post ?

Вот счас абидэл, слюшай)))

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

S
На сайте с 30.09.2016
Offline
469
#3

А не так разве?

add_action('admin_init', 'ym_page_fields', 10, 1);
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
Sly32
На сайте с 29.03.2012
Offline
302
#4
Sitealert:
А не так разве?

Последний параметр по умолчанию равен 1 и необязателен. Приоритет 1 ставлю специально чтоб блок шел сразу за полем контента.

Читайте кодекс

S
На сайте с 30.09.2016
Offline
469
#5

Ну дык... Когда что-то не получается, всё надо перепробовать, и с умолчанием и без...:) А ещё тупой вопрос: не пробовали global $post, но function ym_page_fields() (без аргумента)?

Sly32
На сайте с 29.03.2012
Offline
302
#6
Sitealert:
не пробовали global $post, но function ym_page_fields() (без аргумента)?

Читайте 2-й ответ))) Пробовал.

Я вообще пока не понимаю, почему не работает. Получается что $post оюьявляется только ПОСЛЕ вызова add_meta_box, потому что как видно в примере, после обьявления add_meta... все прекрасно работает. Непонятно.

S
На сайте с 30.09.2016
Offline
469
#7
Sly32:
Читайте 2-й ответ

Я читал. Там не написано, что без аргумента. Дело в том, что непонятно - как аргумент передаётся в функцию, поэтому я и предложил этот вариант. А ещё можно поэкспериментировать с приоритетом, если грешите на то, что $post объявляется после.

---------- Добавлено 10.11.2016 в 15:59 ----------

И не проще ли сделать отдельный хук и в нужный момент - do_action()? Как говорится, "хук правой - и нокаут"😂

Sly32
На сайте с 29.03.2012
Offline
302
#8
Sitealert:
И не проще ли сделать отдельный хук и в нужный момент - do_action()?

Как это можно реализовать в админке? Не очень понял вашу идею. с приоритетами пробовал - они влияют на место, где в админке будет доп поле, но не на вызов функции

S
На сайте с 30.09.2016
Offline
469
#9

Ну не знаю. Вот я тупо вставил в файле admin.php перед строкой do_action('admin_init');

$post=array(

'first' => 1,
'second' => 2
);
function ym_page_fields() {
global $post;
print_r($post);
}

add_action('admin_init', 'ym_page_fields', 1);
На странице отчётливо вижу:
Array ( [first] => 1 [second] => 2 ) 
Так что, всё оно отрабатывает. Просто переменная $post не определена перед вызовом функции.
Sly32
На сайте с 29.03.2012
Offline
302
#10

Sitealert, Ваш вариант ничего не показывает, к сожалению. Естественно, что массив, обьявленный чуть выше, будет виден, мне же нужен стандартный $post, он же $GLOBALS['wp'], в котором обьект...

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

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий