• Как ограничить число регистраций?

    Александр, кому как, признаюсь мало знаком с подобного рода плагинами... (если плагин функциональный, то пока его документацию изучишь или гайды посмотришь...) но посмотрел немного о плагине... не видел что-то о сигнатурах... да и в любом случае в конфиги сервера он не залезет... кроме того, если я верно понял, то он не предотвращает спам в комментах, а удаляет то, что считает спамом, что на мой взгляд не айс мягко говоря... как ни крути надо понимать, что ты делаешь и в любом случае вникать по полной... а то частенько ребята на хабр забегают по типу: ставим плагин супер кеширования и радуются, а через годик/другой приходят и паника... узнают, что год назад потерлась медиа библа и что теперь делать...¯\_(ツ)_/¯
  • Как ограничить число регистраций?

    Александр Торопов, wp-admin:
    используем add_filter('auth_redirect_scheme','stop_redirect',9999); //проверяем если пользователь не авторизован, отдаем, к примеру, 404 страницу при обращении на .../wp-admin или .../admin вместо редиректа на страницу авторизации


    для multisite можем использовать init для редиректов

    что-то похожее на

    if(is_multisite()&&!get_option('users_can_register')){add_action('init','функция');}



    add_filter('site_url','функция',10,3);//подменяем wp-login на свой. Аналогично с wp-comments-post
    
    add_filter('mod_rewrite_rules','функция'); //рулим через .htaccess Дефолтный wp-login, на свою кастомную после смыны. Дефолтный wp-login блочим тут же, либо через настройки веб сервера, например Nginx. Аналогично с wp-comments-post

    чтобы рулы вписались в .htaccess надо обновить(нажать на кнопку «Сохранить изменения») пост. ссылки

    627ddb2fe5113294967288.jpeg

    блочим так же любые обращения к wp-config.php, либо перемещаем файл на директорию выше... многое можно блочить в настройках сервера, если есть доступ ( не забываем тут и о fail2ban)

    например Nginx

    location ~ (xmlrpc|wp-comments-post|wp-config|wp-config-sample|wp-login)\.php$ {
    				error_page   404 /my_super_404.html;
    				return 404;
    }



    события и фильтры для авторизации и регистрации для постоения свое логики защиты, в том числе от брутфорса(перебора):

    add_action('register_form','функция',10,1);
    add_action('login_form','функция');
    add_action('login_enqueue_scripts','функция');
    add_filter('wp_authenticate_user','функция',10,2);
    add_filter('registration_errors','функция');
    add_filter('login_headerurl','функция');
    add_filter('login_headertext','функция');
    add_action('login_footer','функция');
    add_filter('login_redirect','функция');
    add_action('wp_logout','функция');


    комментарии

    add_action('comment_form','функция');
    add_action('pre_comment_on_post','функция',0);
    add_action('init','функция');


    остатки + тот минимум для скрытия сигнатур wp:
    add_filter('xmlrpc_enabled','__return_false');
    add_filter('the_generator','__return_empty_string');
    remove_action('wp_head','rsd_link');//Используется различными блог-клиентами или веб-сервисами для публикации/изменения записей в блоге.
    remove_action('wp_head','feed_links',2);
    remove_action('wp_head','feed_links_extra',3);
    // remove_action('wp_head','rel_canonical');//Убирает канонические линки
    remove_action('wp_head','wlwmanifest_link');// Используется блог-клиентами, а вернее лишь одним из них - Windows Live Writer. Не используете WLW - удаляйте.
    remove_action('wp_head','wp_resource_hints',2);//dns-prefetch
    remove_action('wp_head','wp_shortlink_wp_head');// Убирает короткую ссылку к текущей странице
    remove_action('wp_head','wp_oembed_add_discovery_links');//alternate - application/json+oembed и alternate - text/xml+oembed
    remove_action('wp_head','rest_output_link_wp_head',10,0);//alternate - application/json и rel api.w.org
    remove_action('template_redirect','rest_output_link_header',11,0);//че-то с рест апи


    кроме этого для скрытия сигнатур:
    при создании записей проверять галочку «Разрешить уведомления и обратные ссылки» в обсуждении (должна быть убрана)

    627dd517cfc5c171897437.jpeg

    в некоторых случаях сигнатуры паляться через заданое имя файла скрипта, поэтому может понадобиться подключить/переподключить свое. Например,
    если используется comment-reply - отключаем, но, если нужен, копипастим скрипт из файла в свой файл (возможно и свой jQuery)

    избавляемся от wp-content:

    wp-config.php

    $vab_prot=!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])?$_SERVER['HTTP_X_FORWARDED_PROTO']:'http';
    define('WP_CONTENT_FOLDERNAME','my-super-content');
    define('WP_CONTENT_DIR',ABSPATH . WP_CONTENT_FOLDERNAME) ;
    define('WP_SITEURL',$vab_prot.'://'.$_SERVER['HTTP_HOST'].'/');
    define('WP_CONTENT_URL',WP_SITEURL . WP_CONTENT_FOLDERNAME);



    не забываем, что, если пользуемся костылями, будут лишние заморочки. Например читаем комментарии в том числе. Надо будет и в базе пути поправить (Search-Replace-DB в помощь)

    бонусом

    поменять клыссы в теге body
    add_filter('body_class','функция');


    многие могут сказать, что скрытие сигнатур никакой защиты не дает, но почему на серверах убирают сигнатуры системы и прочего...даже избавление от папки wp-content уже повысит безопасность.

    з.ы. В интернете инфы валом... надо только проявить желание найти. И нюансов по этой теме очень много. возможно я что-то и упустил... в пару строк тут не уложиться. а если ещё и вукомерс подцепить... то и там, к примеру с сигнатурами потеть... не надо забывать, что все, что лежит в инете, лежит в свободном доступе (плагин или тема, сам движок), поэтому и лазейки появляются/меняются. Разрабы ВП дают возможность изменить структуру его движка, но тут надо понимать, что многий функционал, скорее всего, самому писать надо будет (но и цена будет - не пробиваемость)...
  • Как ограничить число регистраций?

    Как ограничить число регистраций?


    совсем обленился народ

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


    Дырки при первой же установки WordPress надо закрывать:
    wp-login
    wp-admin
    xmlrpc
    wp-comments-post
    избавиться от wp-content (можно при желании вовсе сигнатуры wp убить через фильтры и акшны)
    и т.д.
  • Как правильно добавить обертку каждым 2 постам при выводе записей wordpress?

    зачем у Вас открывается php? если Вы пишите на php. у Вас ничего там не едет?!
    <? if ($counter == 1) { ?>

    Вы понимаете, у Вас условие открывающий и закрывающий div`ы в разных условиях. Не выполнится одно из условий и верстка сайта поедет?!
  • Как записать путь до медиафайлов wordpress через php?

    истинное решение вопроса:

    Есть нативная функция wp_upload_dir() для получения массива данных о папке с медиафайлами


    functions.php

    $VAB_UPLOAD = wp_upload_dir();
    if ( ! defined( 'VAB_UPLOAD_DIR' ) ) {
    	define( 'VAB_UPLOAD_DIR', $VAB_UPLOAD['basedir'] );
    }
    if ( ! defined( 'VAB_UPLOAD_URL' ) ) {
    	define( 'VAB_UPLOAD_URL', $VAB_UPLOAD['baseurl'] );
    }



    где-то

    ECHO VAB_UPLOAD_DIR;
    ECHO '<BR>';
    ECHO VAB_UPLOAD_URL;

  • Как записать путь до медиафайлов wordpress через php?

    zeaovede, крайне не рекомендую использовать подобный вариант (На мой взгляд, это тот ещё костыль).

    Решение дал Артем Золин
  • Как вывести публикации авторизованного пользователя?

    Как такое реализовать без плагина?


    Регистрируйте новый тип записей, и если нужно, новую роль. Определяйте права доступа, например,
    где он может видеть свои публикации и проводить с ними некие манипуляции
  • Как сделать сайдбар на wordpress?

    Доброго времени суток.

    Ваш вопрос, на мой взгляд, немного запутан.

    Каким образом можно реализовать такой же сайдбар?


    Решение wp_list_pages. Вопрос в том, что в аргументах

    $arg=array('title_li'=>'','echo'=>0);
    echo wp_list_pages($arg);
    
    //даже так выводит дочерние wp_list_pages();


    результат

    626508d9e6591476970431.jpeg


    А именно как вывести страницы у которых есть дочерние страницы?


    Вам необходимо вывести только те страницы, которые имеют дочерние?
  • Как скрыть поле если оно не заполнено?

    Подскажите как сделать так, что бы поля ozon_ru_link и apteka_ru_link выводились только при условии что они заполнены ссылками в админке


    проверить существует ли значение у указанного поля

    $value = get_field( 'text_field' );
    
    if( $value ) {
    	echo $value;
    }
    else {
    	echo 'empty';
    }
    
    ....
    
    
    
    if ( 'проверяем заполнено ли поле apteka_ru_link' ) { ?>
    	<div class="knopka1">
    		<a rel="nofollow" target="_blank" class="pokypka" href="{{ get_field('apteka_ru_link') }}">
    			<img class="knopochka" src="/wp-content/uploads/2022/04/Без-имени-2.png">
    		</a>
    	</div>
    <?php }
    if ( 'проверяем заполнено ли поле ozon_ru_link' ) { ?>
    <div class="knopka2">
    	<a rel="nofollow" target="_blank" class="pokypka" href="{{ get_field('ozon_ru_link') }}">
        <img class="knopochka" src="/wp-content/uploads/2022/04/Без-имени-3.png">
    	</a>
    </div>
    <?php  }

  • Как добавить таблицу в базу данных worpress?

    Вообщето у WordPress для каждого пользователя есть личная страница... и документация понятная. Разумеется в базе есть место и для данных пользователя.

    Примеры для Айрис:

    Подключаем необходимые стили и скрипты

    add_action('admin_enqueue_scripts','load_admin_styles_scripts');
    if(!function_exists('load_admin_styles_scripts')){
      function load_admin_styles_scripts(){
        wp_enqueue_style('wp-color-picker');
        wp_enqueue_script('wp-color-picker');
    }}



    Подключаем необходимые поля форм к «Айрис» (один из вариантов)

    if(!function_exists('admin_footer_script')){
      function admin_footer_script(){?>
        <script type="text/javascript">
          jQuery(document).ready(function($){
            $('.wpColorChoose').wpColorPicker();});
        </script><?php }}
    add_action('admin_footer','admin_footer_script',99);



    Добавляем «Айрис» на страницу пользователей

    if(!function_exists('VAB_user_fields')){
      function VAB_user_fields($user){
        global $pagenow;
        if($pagenow=='profile.php'||$pagenow=='user-edit.php'){
        wp_nonce_field('VAB_mode_ufields_nonce','VAB_ufields_nonce');
        $id=$user->ID;
        $color=get_the_author_meta('myColor',$id);//получаем мета данные с ключом myColor для текущего пользователя
        echo'<input name="myColor" id="color" type="text" class="wpColorChoose" value="'.$color.'">';
    }}}
    add_action('show_user_profile','VAB_user_fields');
    add_action('edit_user_profile','VAB_user_fields');



    Обрабатываем данные

    if(!function_exists('save_VAB_user_fields')){
      function save_VAB_user_fields($user_id){
        $nonce=filter_input(INPUT_POST,'VAB_ufields_nonce',FILTER_SANITIZE_STRING);
        if(!$nonce){return;}//проверяем наши nonce поля
        if(!wp_verify_nonce($nonce,'VAB_mode_ufields_nonce')){return;}//проверяем наши nonce поля
        $myColor=get_the_author_meta('myColor',$user_id);//получаем мета данные с ключом myColor для текущего пользователя
        $newColor=$_POST['myColor'];//проверяем передачу пост данных... можно доп. обработать фильтрами в зависимости от типа данных
        if(empty($newColor)){//если данные пустые удалим мета
          delete_user_meta($user_id,'myColor');
        }else{//иначе сохраним в мета
         update_user_meta($user_id,'myColor',$newColor);}}}
    add_action('personal_options_update','save_VAB_user_fields');
    add_action('edit_user_profile_update','save_VAB_user_fields');



    Добавим для примера checkbox

    if(!function_exists('VAB_user_fields2')){
      function VAB_user_fields2($user){
        global $pagenow;
        if($pagenow=='profile.php'||$pagenow=='user-edit.php'){
          wp_nonce_field('VAB_mode_ufields_nonce','VAB_ufields_nonce');
          $id=$user->ID;
          $uMeta=get_the_author_meta('uMeta',$id);//получаем мета данные с ключом myColor для текущего пользователя
          $myCheckbox=isset($uMeta['myCheckbox'])?'checked="checked"':'';
          $myColor=isset($uMeta['myColor'])?$uMeta['myColor']:'';
          echo'<input name="uMeta[myCheckbox]" id="myCheckbox" type="checkbox" '.$myCheckbox.'>';
          echo'<br><br>';
          echo'<input name="uMeta[myColor]" id="myColor" type="text" class="wpColorChoose" value="'.$myColor.'">';
        }}}
    add_action('show_user_profile','VAB_user_fields2');
    add_action('edit_user_profile','VAB_user_fields2');



    Обрабатываем данные

    if(!function_exists('save_VAB_user_fields2')){
      function save_VAB_user_fields2($user_id){
        $nonce=filter_input(INPUT_POST,'VAB_ufields_nonce',FILTER_SANITIZE_STRING);
        if(!$nonce){return;}//проверяем наши nonce поля
        if(!wp_verify_nonce($nonce,'VAB_mode_ufields_nonce')){return;}//проверяем наши nonce поля
        $uMeta=get_the_author_meta('uMeta',$user_id);//получаем мета данные с ключом myColor для текущего пользователя
        $newuMeta=$_POST['uMeta'];//проверяем передачу пост данных... можно доп. обработать фильтрами в зависимости от типа данных
        if(empty($newuMeta['myCheckbox'])&&empty($newuMeta['myColor'])){//если данные пустые удалим мета
          delete_user_meta($user_id,'uMeta');
        }else{//иначе сохраним в мета
         update_user_meta($user_id,'uMeta',$newuMeta);}}}
    add_action('personal_options_update','save_VAB_user_fields2');
    add_action('edit_user_profile_update','save_VAB_user_fields2');



    Аналогично получаете и выводите в нужном месте ( get_the_author_meta )... аватарки, не аватарки, управление публичностью данных... можно наворотить что угодно ... все что в голову взбредет...
  • Почему поиск на Wordpress переносит на главную?

    Вы всегда можете открыть файлы дефолтных тем и заглянуть в них...

    например

    <?php
    /**
     * The searchform.php template.
     *
     * Used any time that get_search_form() is called.
     *
     * @link https://developer.wordpress.org/reference/functions/wp_unique_id/
     * @link https://developer.wordpress.org/reference/functions/get_search_form/
     *
     * @package WordPress
     * @subpackage Twenty_Twenty_One
     * @since Twenty Twenty-One 1.0
     */
    
    /*
     * Generate a unique ID for each form and a string containing an aria-label
     * if one was passed to get_search_form() in the args array.
     */
    $twentytwentyone_unique_id = wp_unique_id( 'search-form-' );
    
    $twentytwentyone_aria_label = ! empty( $args['aria_label'] ) ? 'aria-label="' . esc_attr( $args['aria_label'] ) . '"' : '';
    ?>
    <form role="search" <?php echo $twentytwentyone_aria_label; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped above. ?> method="get" class="search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>">
    	<label for="<?php echo esc_attr( $twentytwentyone_unique_id ); ?>"><?php _e( 'Search&hellip;', 'twentytwentyone' ); // phpcs:ignore: WordPress.Security.EscapeOutput.UnsafePrintingFunction -- core trusts translations ?></label>
    	<input type="search" id="<?php echo esc_attr( $twentytwentyone_unique_id ); ?>" class="search-field" value="<?php echo get_search_query(); ?>" name="s" />
    	<input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button', 'twentytwentyone' ); ?>" />
    </form>


    и затем подправить код под себя
  • Почему поиск на Wordpress переносит на главную?

    <?php
    if(!defined('ABSPATH')){exit;}
    $unique_id=wp_unique_id('search-form-');
    ...
    <input type="search" name="s" class="s" id="<?php echo esc_attr($unique_id);?>" title="<?php printf(esc_attr__('Поле для ввода текста','VAB'));?>" placeholder="<?php echo esc_attr__('Текст поиска','VAB'); ?>" value="<?php echo get_search_query();?>"/>
    ...


    что в search.php?

    давайте оба файла полностью...
  • [Решено] Как исправить ошибку "There was an error. You are probably offline" при сохранении виджетов?

    Постучите к хостеру и логи посмотрите...заголовок OPTIONS возможно заблокирован.. ну или верните старый вариант виджетов...сомневаюсь по поводу сертификата...
  • При обновлении шаблона OceanWP сайт падает. Как исправить?

    Ну вот и открывайте этот файл и исправьте эту строку. А вот что нужно исправить , Вы не показали (не полный текст ошибки) . Либо пишите в тех поддержку темы. Либо попробуйте сменить версию php
  • Как переместить "мой профиль" из тулбара в хедер и затем скрыть тулбар?

    разумеется можно.
    для каждого юзера отдельно можно убрать через настройки ( убрать галоку для верхней панели )

    6242df7b11149059406322.jpeg

    либо в функциональном файле для всех

    add_filter( 'show_admin_bar', '__return_false' );

    Разместить ссылку на профиль можно, либо отредактировав код возле Ваших соц сетей

    echo '<a href="'. get_site_url() . '/wp-admin/profile.php">Профиль</a>';


    либо смотрите виджеты темы и возможности в целом

    можно так же создать шорткод и вставить в виджет где-либо,

    либо использовать фильтры для меню и добавить нужные ссылки в меню

    add_filter('wp_nav_menu_items','add_menu_link',10,2);
    if(!function_exists('add_menu_link')){function add_menu_link($items,$args){
    ...


    да и вообще через любой ближний хук/акшн или подобное...
  • Отображение изображений в Wordpress?

    Максим, проверяйте, что возвращают данные

    <div class="entry-content pad_min">
          <div class="slider_page">
            <?php if ( have_rows( 'acf_slider' ) ) : ?>
            <?php while ( have_rows( 'acf_slider' ) ) : the_row(); ?>
            <div class="slider_page_slid">
              <?php $acf_slid = get_sub_field( 'acf_slid' ); ?>
              <?php if ( $acf_slid ) { ?>
              <a href="<?php echo $acf_slid['url']; ?>"><img src="<?php echo $acf_slid['url']; ?>" alt="<?php echo $acf_slid['alt']; ?>" /></a>
              <?php } ?>
            </div>
            <?php endwhile; ?>
            <?php else : ?>
            <?php // no rows found ?>
            <?php endif; ?>
          </div>
        </div>
  • Как сделать отдельные страницы во фронтенде для каждого пользователя?

    LAisen, поменяйте скриншоты... ничего не видно... Жалеете место на хостинге habr.com?)))

    На самом деле все просто. Вопрос в том, как Вы храните эти данные в базе. Если, к примеру, делать по документации вордпресс и сохранять данные в таблице usermeta, то и связь с определенным пользователем будет явной по «ID»

    колонка «user_id»

    623c54e03ca90723566099.jpeg


    остается, где-то, на какой-то нужной Вам страничке на фронте сделать проверку с помощью функций is_user_logged_in и get_current_user_id отдать соответственно данные согладно id юзера.... ну а, если вы как-то иначе сохраняете, то добавьте в данные куда-либо id юзера для которого сохраняете и затем выводите с соответствующей проверкой...
  • Как сделать отдельные страницы во фронтенде для каждого пользователя?

    мало данных. что за странички?!... Совсем не ясно, что Вам нужно

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

    типо

    623ae8cf2a0fc548728263.jpeg


    в противном...

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

    623ae6fbb63b2560810023.jpeg
    623ae703c94a3316860601.jpeg


    и не мог просматривать страницы предназначенные для других пользователей


    просматривать или редактировать? на фронте или в админки?

    вообще Ваш вопрос создает очень много вопросов. Разверните его...
  • Отображение изображений в Wordpress?

    либо что-то еще?


    вполне возможно... на скрине в вопросе, где нет изображений, видно что разметка едет...

    как уже и говорил: угадать не возможно... нужно смотреть/разбираться в живую, а не со скринов...
  • Отображение изображений в Wordpress?

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

    623adc83b2f29971921544.jpeg


    либо, если автор темы предусматривал так сказать удобства, то даже в архиве на каждую страницу запись может быть ссылка при условии, что авторизованный человек имеет возможность редактировать запись
    пример

    623ade43a82ed943621589.jpeg

    все напрямую зависит от темы и настроек сайта...