{"id":11635,"date":"2009-07-13T14:01:48","date_gmt":"2009-07-13T12:01:48","guid":{"rendered":"https:\/\/mamchenkov.net\/blog\/?p=200"},"modified":"2010-03-21T17:28:05","modified_gmt":"2010-03-21T15:28:05","slug":"building-a-classified-ads-directory-with-wordpress","status":"publish","type":"post","link":"https:\/\/mamchenkov.net\/wordpress\/2009\/07\/13\/building-a-classified-ads-directory-with-wordpress\/","title":{"rendered":"Building a classified ads directory with WordPress"},"content":{"rendered":"<!-- google_ad_section_start -->\n<p>When talking about what else WordPress could be used for except blogs, classified ads directories come up high on the list.\u00a0 It&#8217;s one of those examples which illustrate the scenario nicely and doesn&#8217;t require a lot of work.<\/p>\n<p>So, how can WordPress be used to build a classified ads directory?\u00a0 Here is a list of a few ways you might go:<\/p>\n<ol>\n<li><a href=\"http:\/\/wpclassipress.com\/\">Buy and install ClassiPress<\/a> &#8211; a theme and plugin to do just that &#8211; build a classified ads directory.\u00a0 This is probably the fastest, cheapest, and simplest option.\u00a0 If you want one of those directories up and running within a few minutes, that&#8217;s the way to go.<\/li>\n<li>Install <a href=\"http:\/\/wordpress.org\/extend\/plugins\/wp-classified\/\">wp-classified plugin<\/a> and tweak it until you are happy.\u00a0 You&#8217;ll pay with your time, not your money.\u00a0 And you won&#8217;t have to start from scratch.<\/li>\n<li>Build your own, from scratch.\u00a0 This is suitable for those who want to have 100% understanding of how their directory works, and for those who want learn how WordPress can be customized beyond blogging.<\/li>\n<\/ol>\n<p>In this post, I&#8217;ll focus only on the third option.<\/p>\n<p><!--more--><\/p>\n<p>So, before we start building something, it&#8217;s good to get a better idea of what is that we are actually about to build.\u00a0 Here are the things that I think a reasonable classified ads directory should have:<\/p>\n<ol>\n<li><strong>Multiple categories for ads<\/strong> (cars, electronics, books, etc.).\u00a0 Ideally, each ad should be in one category only, but we are not going to force that limitation for now.<\/li>\n<li><strong>Search<\/strong>.\u00a0 Categories are good, but we should be able to just type whatever is that we are looking for and find it.<\/li>\n<li><strong>User submitted ads, with some moderation<\/strong>.\u00a0 SPAM bots will probably be all over this, so we need some protection, without making it too hard for legitimate users.<\/li>\n<li><strong>Notification system for new ads<\/strong> &#8211; RSS feeds, email notifications, Twitter updates, or any combination of these.<\/li>\n<li><strong>Content rich, template ads<\/strong>.\u00a0 So that we can have pictures associated with ads, as well as custom data.\u00a0 For example, for cars we could ask about manual or automatic gearbox, etc.<\/li>\n<\/ol>\n<p>There are of course a gadzillion of other things that we can add, but the point is to demonstrate WordPress-based problem solving within realistic scenarios, not to build a perfect classified ads directory.<\/p>\n<p>Now that we know what we want (not to be confused with what women want), how can we build it?\u00a0 From the top of my head, I can suggest three possible directions:<\/p>\n<ol>\n<li>Completely customized solution within WordPress.\u00a0 That would probably be packaged as a plugin, which creates and populates its own database tables, has its own administration interface, and such.<\/li>\n<li>Re-use WordPress comments.<\/li>\n<li>Re-use WordPress posts and post by email functionality.<\/li>\n<\/ol>\n<p>Option 1 will require us to build a lot of stuff from scratch.\u00a0 The good things about this approach is that we can have a high degree of fine-tuning. For example, in such a system, we&#8217;d have custom tables to hold our ads, with very specific fields that we want.\u00a0 And we can have really specific administration interface.\u00a0 On the WordPress side, we&#8217;d probably reuse user permissions, friendly URLs, and plugin architecture (installation, upgrade, initialization, options, etc).\u00a0 The downside of this approach is the same &#8211; a lot of development.\u00a0 It will take some time to write all that code and fit it into WordPress.\u00a0 Then debug and maintain it.\u00a0 And then solve all the problems that will arise, like SPAM control and moderation of ads.\u00a0 While it can work, it&#8217;s not what I&#8217;d go for.<\/p>\n<p>Option 2 is based around WordPress comments.\u00a0 We can create an empty post for each ad category that we want (cars, books, electronics, etc).\u00a0 Then a customized comment form could be used to submit ads to the specific category.\u00a0 The pros of this approach are: very little coding to be done (most of it is already there), moderation system is built-in and SPAM control can be handled by plugins like Akismet.\u00a0 Additional benefits include Gravatar support, and threads, which could be used as comments to ads (first level \/ parent comments).\u00a0 Also the RSS feeds are there.\u00a0 And even search problem could be solved with one of those enhanced search plugins.\u00a0 Rich content is also not a big problem with advanced editor plugins.\u00a0 In the cons, I&#8217;d specify flexibility.\u00a0 Since there are only so many things that you can do with comments.<\/p>\n<p>Option 3 is based on WordPress posts.\u00a0 We&#8217;ll have regular categories like in the blog, and each ad would be a separate post.\u00a0 We can extend the post_type field in wp_posts table with pretty much anything we want, which would give us the control of custom fields for different ad types (fields for cars are different from fields for electronics).\u00a0 Search is ready.\u00a0 As are RSS feeds.\u00a0 And integration with notification emails, Twitter updates, etc. is trivial.\u00a0 Just install any of the plugins that broadcasts your posts and you are done.\u00a0 Figuring out the user submission and moderation processes might take some time, but with posts being more flexible (IMHO) than comments, it seems There Is More Than One Way To Do It.\u00a0 That&#8217;s a Perl motto if you didn&#8217;t know.<\/p>\n<p>One of the ways to submit user content with SPAM filtering and pre-moderation might be via post by email functionality available in WordPress.\u00a0 The idea is the following.\u00a0 We create a new POP3 mailbox for those incoming ads.\u00a0 Ideally, we should probably open Gmail account, as it both supports POP3 and has excellent SPAM filtering.\u00a0 Once the POP3 account is working, we can configure WordPress post by email options.\u00a0 We&#8217;d want a separate category for these incoming messages (&#8220;new&#8221;, &#8220;incoming&#8221;, &#8220;to-moderate&#8221;) or something like that. Not one of the categories that we feature on the front page (&#8220;cars&#8221;, &#8220;books&#8221;, &#8220;electronics&#8221;, etc).\u00a0\u00a0 Once this is done, we can install one of those Contact Form plugins which helps to configure a form for site visitors and sends submitted results by email.\u00a0 In the destination mailbox we need to put the POP3 mailbox.\u00a0 Additional bonus: most of the Contact Form plugins have some sort of SPAM filtering capabilities as well.\u00a0 So we&#8217;d be protected both by the form plugin and POP3 SPAM filtering system.<\/p>\n<p>As you might have guessed, Option 3 is my favourite direction.\u00a0 It seems more natural to handle ads as posts than anything else.\u00a0 And if I were to build a classifieds ads directory, that would probably be the approach that I&#8217;d take.<\/p>\n<p>Let&#8217;s see if I can pull it off.\u00a0 So, the implementation plan so far is:<\/p>\n<ol>\n<li>Create a new POP3 mailbox with some SPAM filtering (Gmail to the rescue).<\/li>\n<li>Install fresh WordPress (not required, but since I don&#8217;t have anything else to play with I&#8217;ll go for that).<\/li>\n<li>Configure posting by email in WordPress via the POP3 account created in step 1.<\/li>\n<li>Install some Contact Form plugin that can send submitted results to email. Set it to use the POP3 account from step 1.<\/li>\n<li>Create a page with the contact form.<\/li>\n<li>Create categories for ads (cars, books, electronics).<\/li>\n<li>Create a custom theme (very basic, for the sake of the example) to display ads from difference categories, and show the search form as well.<\/li>\n<li>Submit some ads via contact form in page created by step 5.<\/li>\n<li>Moderate the incoming ads from step 8 to approve some and decline the others.<\/li>\n<li>Summarize the experience, provide useful links, ???, <strong>PROFIT<\/strong>.<\/li>\n<\/ol>\n<p>Let&#8217;s go!<\/p>\n<p><strong>Step 1<\/strong>.<\/p>\n<p>Creating a new Gmail mailbox is as easy as installing WordPress these days.\u00a0 Make sure that you follow WordPress recommendation (from the <em>Post via e-mail<\/em> section of the <em>Writing<\/em> administration screen):<\/p>\n<blockquote><p>To post to WordPress by e-mail you must set up a secret e-mail account with POP3 access. Any mail received at this address will be posted, so it\u2019s a good idea to keep this address very secret.<\/p><\/blockquote>\n<p>to Once registered, you need to go to <em>Settings<\/em>, <em>Fowarding and POP\/IMAP<\/em>, and in <em>POP Downloads<\/em> section <em>Enable POP for all mail<\/em>.<\/p>\n<p><strong>Step 2<\/strong>.<\/p>\n<p>Installing a new WordPress is trivial.\u00a0 <a href=\"http:\/\/wordpress.org\/download\/\">Download<\/a> the archive, unzip into the folder where web server can see it, create a new MySQL database, copy <em>wp-config-sample.php<\/em> file to <em>wp-config.php<\/em> and update it with the location and credentials of that database.\u00a0 Now visit the the URL of your new WordPress site and finish the installation by specifying the blog title and admin email, and changing random password of administrator account to something that you can actually remember.\u00a0 Done.<\/p>\n<p><strong>Step 3<\/strong>. Configuration of POP3 access in WordPress turned out to be a bit trickier than I expected, but I managed to get through anyway.\u00a0 By default, WordPress suggests the plain-text POP3 connection (port 110).\u00a0 However, Gmail insists on encrypted connection (port 995), which is better, because it is more secure. Just changing the port in configuration didn&#8217;t help.\u00a0 But once I stumbled upon <a href=\"http:\/\/wordpress.org\/extend\/ideas\/topic\/pop3-over-ssl-support-enables-post-via-mail-from-gmail\">this thread in WordPress Ideas<\/a>, everything started to fall into place.\u00a0 My problem was that in <em>Mail Server<\/em> field I had <em>pop.gmail.com<\/em> .\u00a0 When I changed that to <em>ssl:\/\/pop.gmail.com<\/em> (with port still set to 995), it worked liked a charm.<\/p>\n<p>One thing that you would probably be confused about after setting up the above is how to actually tell WordPress to import messages from the POP3 account.\u00a0 It doesn&#8217;t do it automatically.\u00a0 To force it, you&#8217;ll need to visit <em>yourdomain.com\/path\/to\/your\/wordpress\/wp-mail.php<\/em> .\u00a0 And since we are all about automation, I suggest that you tell your scheduler to fetch this page automatically every few minutes (&#8220;<em>\/usr\/bin\/wget -O \/dev\/null -q URL<\/em>&#8220;, or something like that).<\/p>\n<p>I also recommend to create a separate category, like &#8220;Moderatorial&#8221;, where all posts from email will go.\u00a0 When doing approvals, we&#8217;ll remove them from this category and place in the appropriate ad category.<\/p>\n<p>If you did everything right and all stars aligned properly, your WordPress will now import emails from that POP3 account into your blog.\u00a0 Try sending a few emails to that secret account of yours and see.\u00a0 Also, try sending emails from several different emails there.\u00a0 You might notice that something cool is happening.\u00a0 Looking through wp-mail.php source code, I noticed that WordPress does the following check:<\/p>\n<ul>\n<li>get email sender&#8217;s email address from From: or Reply-To: field<\/li>\n<li>clean-up that email address<\/li>\n<li>check if there is a registered WordPress user with such email (in your database, not in WordPress.com)<\/li>\n<li>if found, check if this user has permission to publish posts<\/li>\n<\/ul>\n<p>If user was not found or if user was found but he doesn&#8217;t have permission to publish posts, then the post status will be &#8220;<em>pending<\/em>&#8220;.\u00a0 If the user was found and he can publish posts, then the status will be &#8220;<em>publish<\/em>&#8220;.\u00a0 That means that for approved users, posts will get get published automatically, while for everyone else you&#8217;ll need to manually approve posts.\u00a0 And also, if the user was found by the email address, then the post author will be set to this user.\u00a0 I think this is just <strong>awesome<\/strong>!<\/p>\n<p><strong>Step 4<\/strong>.<\/p>\n<p>Now for the contact form plugin.\u00a0 There are a few to choose from.\u00a0 Keeping in mind that we are building a classified ads directory, which should have at least some flexibility, I went for the <a href=\"http:\/\/wordpress.org\/extend\/plugins\/contact-form-7\/\">Contact Form 7<\/a> plugin.\u00a0 It has supports multiple contact forms, and has a nice interface for building those forms (field types, captions, required \/ not required, email templates, destination email addresses, etc).\u00a0 It even supports file uploads and limits of file sizes on those fields.\u00a0 That&#8217;s pretty cool too.\u00a0 For every form you build, it gives your a short tag to put into the page or post to have the form rendered.\u00a0 Make sure you specify the destination email to be the one WordPress checks via POP3, because by default the destination email is of the site administrator.\u00a0 Or currently logged in user.<\/p>\n<p><strong>Step 5<\/strong>.<\/p>\n<p>Creating pages is a routine task.\u00a0 For every ad category that we will have, we can create a separate contact form.\u00a0 For each contact form we can create a separate page, where the short tag for that specific form is pasted.\u00a0 Takes about 4 seconds per page.\u00a0 Done.<\/p>\n<p><strong>Step 6<\/strong>.<\/p>\n<p>Create categories for ads.\u00a0 That&#8217;s so simple that the only reason I put it here is just not to forget.\u00a0 If you don&#8217;t know how to do it for some reason, go to your WordPress administration and look under <em>Posts<\/em>, <em>Categories<\/em>.<\/p>\n<p><strong>Step 7<\/strong>.<\/p>\n<p>Create a custom theme.\u00a0 That&#8217;s where things start to get interesting.\u00a0 Most of the themes that you&#8217;ll find in the wild are for blogs.\u00a0 And we need a classified ads directory.\u00a0\u00a0 Those look different.\u00a0 If you don&#8217;t know how, just imagine a page with a large search box in the top-middle of the page, and then a few vertical blocks aligned horizontally (yeah, I know it sounds confusing), with each block featuring a few ads from a specific category.\u00a0 Here is for example, a partial screenshot of a popular <a href=\"http:\/\/london.craigslist.co.uk\/\">Craigslist directory<\/a>:<\/p>\n<figure id=\"attachment_211\" aria-describedby=\"caption-attachment-211\" style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/london.craigslist.co.uk\/\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-211\" title=\"craigslist.co.uk\" src=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2009\/07\/craigslit_co_uk.png?resize=500%2C153&#038;ssl=1\" alt=\"craigslist.co.uk\" width=\"500\" height=\"153\" \/><\/a><figcaption id=\"caption-attachment-211\" class=\"wp-caption-text\">craigslist.co.uk<\/figcaption><\/figure>\n<p>The goal of this post is to illustrate the process, so let&#8217;s follow the simplistic path.\u00a0 We&#8217;ll need to build a custom theme with a somewhat non-traditional front page.\u00a0 The rest of the pages &#8211; category, archive, and search result listings &#8211; will look as on the usual blog.\u00a0 The front page however will have a search box and a few posts from each category that we have.<\/p>\n<p>The best way to assess what we will need to change and how much work that will be, is to look at <a href=\"http:\/\/codex.wordpress.org\/Template_Hierarchy\">WordPress template hierarchy<\/a>.\u00a0 It seems that we can dump everything into two files only: <em>style.css<\/em> and <em>index.php<\/em> .\u00a0 Here is what I got after a few minutes of poking around.<\/p>\n<pre class=\"brush: css; title: ; notranslate\" title=\"\">\r\n\/*\r\n * Theme Name: WP Classified Ads\r\n * Author: Leonid Mamchenkov\r\n *\/\r\n\r\nbody { background-color: #ffffff; width: 80%; margin: auto;}\r\n\r\n#searchform {\r\n        width: 400px;\r\n        background-color: #eeeeee;\r\n        padding: 20px;\r\n        text-align: center;\r\n        margin: auto;\r\n        border: 3px double #000000;\r\n}\r\n\r\n#searchform input {\r\n        border: 1px solid #000000;\r\n}\r\n\r\nh1, h3 {\r\n        text-align: center;\r\n}\r\n\r\n\/* front page box for each category *\/\r\n.cat-box {\r\n        float: left;\r\n        display: inline;\r\n        padding: 10px;\r\n        margin: 5px;\r\n        border: 1px solid #000000;\r\n        width: 220px;\r\n}\r\n<\/pre>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;html&gt;\r\n    &lt;head&gt;\r\n        &lt;?php wp_head(); ?&gt;\r\n        &lt;title&gt;&lt;?php wp_title(); ?&gt; &lt;?php bloginfo('name'); ?&gt;&lt;\/title&gt;\r\n        &lt;link rel=&quot;stylesheet&quot; href=&quot;&lt;?php bloginfo('stylesheet_url'); ?&gt;&quot; type=&quot;text\/css&quot; media=&quot;screen&quot; \/&gt;\r\n    &lt;\/head&gt;\r\n    &lt;body&gt;\r\n        &lt;h1&gt;&lt;a href=&quot;&lt;?php get_option('home'); ?&gt;&quot;&gt;&lt;?php bloginfo('name') ?&gt;&lt;\/a&gt;&lt;\/h1&gt;\r\n        &lt;?php\r\n            \/\/ Always show the search form\r\n            get_search_form();\r\n\r\n            \/\/ Display front page\r\n            if (is_home()) {\r\n                $ads_limit = 5; \/\/ how many ads from each category to show\r\n                echo &quot;&lt;h3&gt;we are on the front page&lt;\/h3&gt;&quot;;\r\n\r\n                $categories = (array) get_categories();\r\n                foreach ($categories as $category) {\r\n\r\n                    $cat_url = get_category_link($category-&gt;cat_ID);\r\n\r\n                    query_posts('category_name=' . $category-&gt;slug . '&amp;showposts='. $ads_limit);\r\n                    \/\/ only show category box if there are any ads in it\r\n                    if (have_posts()) {\r\n                        ?&gt;\r\n                        &lt;div class=&quot;cat-box&quot;&gt;\r\n                            &lt;h3&gt;&lt;a href=&quot;&lt;?php echo $cat_url; ?&gt;&quot;&gt;&lt;?php echo $category-&gt;name ?&gt;&lt;\/a&gt;&lt;\/h3&gt;\r\n                            &lt;ul&gt;\r\n                            &lt;?php\r\n                                while (have_posts()) {\r\n                                    the_post();\r\n                                    ?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?php echo the_permalink(); ?&gt;&quot;&gt;&lt;?php the_title(); ?&gt;&lt;\/a&gt;&lt;\/li&gt;&lt;?php\r\n                                }\r\n                            ?&gt;\r\n                            &lt;\/ul&gt;\r\n                        &lt;\/div&gt;\r\n                        &lt;?php\r\n                    }\r\n                }\r\n            }\r\n            \/\/ Dispay standalones\r\n            elseif (is_single() || is_page()) {\r\n                if (have_posts()) {\r\n                    while (have_posts()) {\r\n                        the_post();\r\n                        ?&gt;&lt;h3&gt;&lt;a href=&quot;&lt;?php echo the_permalink(); ?&gt;&quot;&gt;&lt;?php the_title(); ?&gt;&lt;\/a&gt;&lt;\/h3&gt;&lt;?php the_content() ?&gt;&lt;br \/&gt;&lt;?php\r\n                    }\r\n                }\r\n                else {\r\n                    echo &quot;&lt;h3&gt;you are in a very weird place&lt;\/h3&gt;&quot;;\r\n                }\r\n\r\n            }\r\n            \/\/ Display post collections\r\n            else {\r\n                if (is_search()) {\r\n                    echo &quot;&lt;h3&gt;search results&lt;\/h3&gt;&quot;;\r\n                }\r\n                elseif (is_category()) {\r\n                    echo &quot;&lt;h3&gt;category results&lt;\/h3&gt;&quot;;\r\n                }\r\n                else {\r\n                    echo &quot;&lt;h3&gt;we are somewhere else&lt;\/h3&gt;&quot;;\r\n                }\r\n                \/\/ show relevant posts\r\n                if (have_posts()) {\r\n                    echo &quot;&lt;ul&gt;&quot;;\r\n                    while (have_posts()) {\r\n                        echo &quot;&lt;li&gt;&quot;;\r\n                        the_post();\r\n\r\n                        ?&gt;&lt;a href=&quot;&lt;?php echo the_permalink(); ?&gt;&quot;&gt;&lt;?php the_title(); ?&gt;&lt;\/a&gt;&lt;?php\r\n                        echo &quot;&lt;\/li&gt;&quot;;\r\n                    }\r\n                    echo &quot;&lt;\/ul&gt;&quot;;\r\n                }\r\n                else {\r\n                   echo &quot;&lt;h3&gt;nothing here to display&lt;\/h3&gt;&quot;;\r\n                }\r\n            }\r\n        ?&gt;\r\n        &lt;?php wp_footer(); ?&gt;\r\n    &lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>And here is the screenshot of how it looks.<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-212\" title=\"classified ads directory\" src=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2009\/07\/classified_ads_directory.png?resize=500%2C209&#038;ssl=1\" alt=\"classified ads directory\" width=\"500\" height=\"209\" \/><\/p>\n<p>Of course, the styling and content needs some work, but that&#8217;s a start.\u00a0 Now, let&#8217;s recap those requirements we had for the classified ads:<\/p>\n<ol>\n<li>Multiple categories for ads.\u00a0 <strong>Check<\/strong>.<\/li>\n<li>Search. <strong>Check<\/strong>.<\/li>\n<li>User submitted ads, with some moderation. <strong>Check<\/strong>.\u00a0 If you don&#8217;t like the fact that &#8220;Moderatorial&#8221; category is displayed, you can easily exclude it.\u00a0 I left purely for demonstration and lack of any real content.<\/li>\n<li>Notification system for new ads. <strong>Check<\/strong>.\u00a0 All built-in WordPress RSS feeds are still working. All posts and category feeds are of the most importance here. Plus you can have any of the usual plugins for post broadcasts via email, Twitter, Facebook, etc.<\/li>\n<li>Content rich template ads. <strong>No check<\/strong>.\u00a0 WordPress email posting mechanism by default cleans HTML out of incoming emails.\u00a0 There is a workaround, however we won&#8217;t go into it at this time.\u00a0 The workaround involves the custom email posting plugin.\u00a0 This should work, because WordPress makes raw content of the email available to plugins (via a hook).\u00a0 And as I said, it should work, but I haven&#8217;t tried it myself yet.<\/li>\n<\/ol>\n<p>So, with just a few minutes of work (OK, close to an hour), we have ourselves a rather flexible and robust classified ads directory.\u00a0 We can grow it with more customizations in-house and with more WordPress plugins.\u00a0 And we can control every tiny bit of display via custom themes.\u00a0 And I think that&#8217;s pretty cool.<\/p>\n<p>Now, what do you have to say?<\/p>\n<!-- google_ad_section_end -->\n","protected":false},"excerpt":{"rendered":"<!-- google_ad_section_start -->\n<p>When talking about what else WordPress could be used for except blogs, classified ads directories come up high on the list.\u00a0 It&#8217;s one of those examples which illustrate the scenario nicely and doesn&#8217;t require a lot of work. So, how can WordPress be used to build a classified ads directory?\u00a0 Here is a list of &hellip; <a href=\"https:\/\/mamchenkov.net\/wordpress\/2009\/07\/13\/building-a-classified-ads-directory-with-wordpress\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Building a classified ads directory with WordPress<\/span><\/a><\/p>\n<!-- google_ad_section_end -->\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_links_to":"","_links_to_target":""},"categories":[1,62,60],"tags":[1905,1364,1906],"keyring_services":[],"class_list":["post-11635","post","type-post","status-publish","format-standard","hentry","category-general","category-technology","category-wordpress","tag-wordpress-internals","tag-wordpress-themes","tag-wordpress-tips"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":9488,"url":"https:\/\/mamchenkov.net\/wordpress\/2005\/09\/23\/finding-files-in-linux\/","url_meta":{"origin":11635,"position":0},"title":"Finding files in Linux","author":"Leonid Mamchenkov","date":"September 23, 2005","format":false,"excerpt":"Many beginning Linux users experience difficulties getting used to the filesystem structure. Indeed, there are many files and directories, the structure of which are not as obvious as it could be. Choosing an appropriate location for a new file or directory is difficult and many choose to follow their own\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":31955,"url":"https:\/\/mamchenkov.net\/wordpress\/2019\/02\/05\/dotfile-madness\/","url_meta":{"origin":11635,"position":1},"title":"Dotfile madness","author":"Leonid Mamchenkov","date":"February 5, 2019","format":false,"excerpt":"\"Dotfile madness\" is an excellent look at the problem of hidden data and configuration files that seem to be multiplying lately in the users' home directories: We are no longer in control of our home directories.My own home directory contains 25 ordinary files and 144 hidden files. The dotfiles contain\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11351,"url":"https:\/\/mamchenkov.net\/wordpress\/2008\/08\/27\/convert-russian-mp3-id3-tags-from-koi8-cp1251-to-utf8\/","url_meta":{"origin":11635,"position":2},"title":"mp3 collection maintenance","author":"Leonid Mamchenkov","date":"August 27, 2008","format":false,"excerpt":"I have a rather large MP3 collection.\u00a0 The directories and files are named correctly more or less, but ID3 tags used to be a mess until very recently.\u00a0 Two applications helped me to bring some order in that mess. EasyTag, a GUI application, that helped me to fix lots of\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":8282,"url":"https:\/\/mamchenkov.net\/wordpress\/2004\/12\/03\/blosxom\/","url_meta":{"origin":11635,"position":3},"title":"blosxom","author":"Leonid Mamchenkov","date":"December 3, 2004","format":false,"excerpt":"For my company blog I decided to try a different tool. Since I am mostly using Perl for all my tasks, I thought why not to get some content management system (CMS) which is written in Perl. A quick tour around suggested blosxom. It turned out to be a pretty\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":24099,"url":"https:\/\/mamchenkov.net\/wordpress\/2015\/05\/13\/vagrant-libvirt-fedora-21\/","url_meta":{"origin":11635,"position":4},"title":"Vagrant adventures on Fedora 21","author":"Leonid Mamchenkov","date":"May 13, 2015","format":false,"excerpt":"I spent a large chunk of yesterday experimenting with Vagrant on my Fedora 21 laptop. \u00a0I've used it before of course, but a friend asked for help with something I was planning to play with for a long time, so it\u00a0unexpectedly lead me into a journey. Let's start simple. \u00a0If\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":9078,"url":"https:\/\/mamchenkov.net\/wordpress\/2005\/06\/15\/telling-gnu-arch-the-truth\/","url_meta":{"origin":11635,"position":5},"title":"Telling Gnu Arch the truth","author":"Leonid Mamchenkov","date":"June 15, 2005","format":false,"excerpt":"Yet another problem (and solution) that I've stumbled across while using Gnu Arch. We have two branches in our archive: program--vendor--0.1 and program--local--0.1. Vendor's version has all the source files in SomeDirectory, while our local version has all source files in somedir. Except for the name and few local changes,\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/11635","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/comments?post=11635"}],"version-history":[{"count":0,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/11635\/revisions"}],"wp:attachment":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/media?parent=11635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/categories?post=11635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/tags?post=11635"},{"taxonomy":"keyring_services","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/keyring_services?post=11635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}